使用 New-SmbGlobalMapping 为 docker 容器创建的 SMB 共享映射在 windows 服务器 1803 上重新启动后未恢复
SMB share mappings created with New-SmbGlobalMapping for docker containers not restored after reboot on windows server 1803
我正在尝试创建一个简单的 Docker 主机来尝试将容器用于某些 .net 项目。
我已经设置了一个 Windows 服务器 1803 主机并安装了 Docker 带有 powershell 的 EE,它 运行 正在作为一项服务正确运行。
我想使用自 1709 年以来可用的新 "SMB Global Mapping" 功能在我的域上映射 samba 共享并在容器中使用它,而无需求助于 gMSA 或其他技巧,我希望它自动挂载并启动使用 docker 重新启动策略重新启动的容器,就好像它们是 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 commandlet 的 -Persistent 参数。
我还将此 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;
对于那些绊倒的人,New-SmbGlobalMapping
有一个需要设置为 $true
的 Persistent
标志,即
New-SmbGlobalMapping -Persistent $true -RemotePath \contosofileserver\share1 -Credential $creds -LocalPath G:
我正在尝试创建一个简单的 Docker 主机来尝试将容器用于某些 .net 项目。
我已经设置了一个 Windows 服务器 1803 主机并安装了 Docker 带有 powershell 的 EE,它 运行 正在作为一项服务正确运行。
我想使用自 1709 年以来可用的新 "SMB Global Mapping" 功能在我的域上映射 samba 共享并在容器中使用它,而无需求助于 gMSA 或其他技巧,我希望它自动挂载并启动使用 docker 重新启动策略重新启动的容器,就好像它们是 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 commandlet 的 -Persistent 参数。
我还将此 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;
对于那些绊倒的人,New-SmbGlobalMapping
有一个需要设置为 $true
的 Persistent
标志,即
New-SmbGlobalMapping -Persistent $true -RemotePath \contosofileserver\share1 -Credential $creds -LocalPath G: