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

fra*_*one 6 powershell smb samba windows-server docker

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

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

我想使用自 1709 年以来可用的新“SMB 全局映射”功能来映射我的域上的 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
Run Code Online (Sandbox Code Playgroud)

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

Raf*_*era 9

对于那些在这New-SmbGlobalMapping方面绊倒的人,有一个Persistent需要设置为的标志$true,即

New-SmbGlobalMapping -Persistent $true -RemotePath \\contosofileserver\share1 -Credential $creds -LocalPath G:
Run Code Online (Sandbox Code Playgroud)


小智 6

我还将此 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:;
Run Code Online (Sandbox Code Playgroud)

现在,创建一个以服务器 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;
Run Code Online (Sandbox Code Playgroud)