使用 New-SmbGlobalMapping 为 docker 容器创建的 SMB 共享映射在 Windows Server 1803 上重新启动后未恢复

Posted

技术标签:

【中文标题】使用 New-SmbGlobalMapping 为 docker 容器创建的 SMB 共享映射在 Windows Server 1803 上重新启动后未恢复【英文标题】:SMB share mappings created with New-SmbGlobalMapping for docker containers not restored after reboot on windows server 1803 【发布时间】:2018-10-29 03:19:48 【问题描述】:

我正在尝试创建一个简单的 Docker 主机来尝试将容器用于某些 .net 项目。

我已经设置了一个 Windows Server 1803 主机并使用 powershell 安装了 Docker EE,它作为服务正确运行。

我想使用自 1709 年以来可用的新“SMB 全局映射”功能来映射我的域上的 samba 共享并在容器中使用它,而无需借助 gMSA 或其他技巧,我希望它能够自动挂载并在以下位置启动容器使用 docker restart 策略重新启动,就好像它们是 Windows 服务一样。

我运行了这些命令,一切正常

$creds = Get-Credential 

New-SmbGlobalMapping -RemotePath \\contosofileserver\share1 -Credential $creds -LocalPath G:

docker run -v G:/:G: -it test cmd.exe

但在主机重新启动后,G: 不再映射,因此我无法理想地将容器置于自动启动状态。我猜这是因为凭据没有在任何地方持久存在,但即使在那之后,我也怀疑 powershell 命令是否会使任何东西保持原样,还因为它缺少标准 New-SmbMapping 命令行开关的 -Persistent 参数。

【问题讨论】:

bloggingforlogging.com/2018/11/22/… 【参考方案1】:

对于那些绊脚石的人,New-SmbGlobalMapping 有一个Persistent 标志,需要设置为$true,即

New-SmbGlobalMapping -Persistent $true -RemotePath \\contosofileserver\share1 -Credential $creds -LocalPath G:

【讨论】:

【参考方案2】:

我还将此 cmdlet 用于 Windows Server 1803 和 Docker。为了解决这个问题,我做了以下事情:

在 C:\data\smbshare.ps1 中创建这个 PS1 脚本

$secpasswd = ConvertTo-SecureString 'password' -AsPlainText -Force;
$creds = New-Object System.Management.Automation.PSCredential ("domain\user", $secpasswd);
New-SmbGlobalMapping -RemotePath 'RemotePath' -Credential $creds -LocalPath X:;

现在,创建一个从服务器 StartUP 开始的计划任务。我用这个 cmdlet 来做这个:

$Action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-file C:\data\smbshare.ps1" -WorkingDirectory "C:\data";
$Trigger = New-ScheduledTaskTrigger -AtStartup;
$Settings = New-ScheduledTaskSettingsSet -DontStopOnIdleEnd -RestartInterval (New-TimeSpan -Minutes 1) -RestartCount 10 -StartWhenAvailable;
$Settings.ExecutionTimeLimit = "PT0S";
$SecurePassword = ConvertTo-SecureString 'password' -AsPlainText -Force;
$UserName = "domain\user";
$Credentials = New-Object System.Management.Automation.PSCredential -ArgumentList $UserName, $SecurePassword;
$Password = $Credentials.GetNetworkCredential().Password;
$Task = New-ScheduledTask -Action $Action -Trigger $Trigger -Settings $Settings;
$Task | Register-ScheduledTask -TaskName 'SMBGlobalShare' -User "domain\user" -Password $Password;

【讨论】:

谢谢,这很好。微软在“我们爱 docker”上一路走来,难道不奇怪吗?但不认为 windows 的 docker 需要以更简单的方式为 windows 应用程序持久化凭据和共享? 太棒了。为了帮助谷歌,这种方法为我解决了身份验证问题(例如,类型“bind”的无效装载配置:CreateFile 用户名密码),而不是使用其他地方推荐的“net”命令

以上是关于使用 New-SmbGlobalMapping 为 docker 容器创建的 SMB 共享映射在 Windows Server 1803 上重新启动后未恢复的主要内容,如果未能解决你的问题,请参考以下文章

无法使用类型为“()”的参数列表为类型“Int”调用初始化程序

使用WPF将图片转变为灰度并加上水印并保存为文件

如何使用 agggrid 导出为 csv 功能为 excel 文件数据添加边框?

使用 Java 将 Json 对象转换为 Parquet 格式而不转换为 AVRO(不使用 Spark、Hive、Pig、Impala)

如何使用 Alamofire 为每个请求添加 auth 标头,如果响应为 401 则执行某些操作?

如何使用纹理将 fbx 转换为 usdz