使用 packer powershell provisioner 将 Azure 文件共享映射到服务帐户

Using packer powershell provisioner to map an Azure file share to a service account

我正在尝试弄清楚如何将文件共享映射到我使用旨在作为服务帐户的 Powershell 脚本创建的特定用户。最终结果是我的服务帐户应该能够访问“\\storageaccount.file.core.windows.net\share”

处的 UNC 路径

下面是我如何通过 Packer 的 powershell provisioner 创建服务帐户。

$password = ConvertTo-SecureString "ServiceAccountPassword" -AsPlainText -Force
New-LocalUser "ServiceAccount" -Password $password -FullName "ServiceAccount"
Add-LocalGroupMember -Group "Administrators" -Member "ServiceAccount"

因为 Packer 使用 Packer 生成的用户执行 Powershell 代码,所以我创建了一个计划任务 运行 在 SYSTEM 帐户启动时创建一个批处理文件。

"net use Z: \storageaccount.file.core.windows.net\share azurestorageaccesskey /user:Azure\storageaccount /persistent:yes" | Out-File -FilePath "C:\MapAzureFileShare.bat" -Encoding "ASCII"
$action = New-ScheduledTaskAction -Execute "C:\MapAzureFileShare.bat"
$trigger = New-ScheduledTaskTrigger -AtStartup -RandomDelay 00:00:30
$settings = New-ScheduledTaskSettingsSet -Compatibility "Win8"
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType "ServiceAccount" -RunLevel "Highest"
$task = New-ScheduledTask -Action $action -Principal $principal -Trigger $trigger -Settings $settings -Description "Map Azure file share at startup"
Register-ScheduledTask -TaskName "MapAzureFileShare" -InputObject $task

下面的脚本会为所有用户创建一个网络驱动器,不幸的是运行实际上,网络驱动器是一个断开连接的驱动器,当我以刚刚创建的服务帐户登录时无法访问。它会说 "The username or password is incorrect."

我也试过创建计划任务给运行作为创建用户。

$action = New-ScheduledTaskAction -Execute "C:\MapAzureFileShare.bat"
$trigger = New-ScheduledTaskTrigger -AtStartup -RandomDelay 00:00:30
$settings = New-ScheduledTaskSettingsSet -Compatibility "Win8"
$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings 
$settings -Description "Map Azure file share at startup"
Register-ScheduledTask -TaskName "MapAzureFileShare" -InputObject $task -User "ServiceAccount" -Password "ServiceAccountPassword"

没有任何映射,如果我手动 运行 此计划任务似乎也不会发生任何事情。但是,如果我将上述计划任务切换为 运行 Only When User is Logged On 并手动执行任务,则会创建网络映射。

如果我尝试 运行 作为我刚创建的用户的批处理文件,文件共享映射得很好。

还有什么我可以尝试的吗?

我能够弄清楚如何通过脚本创建网络映射并使其持久化。

因此,我没有以迂回的方式使用任务计划程序 运行 作为身份,而是能够使用 PsExec 运行 作为我想使用的帐户。

首先生成两个批处理文件,一个用于将 Windows 凭据保存到我要映射到的帐户,一个用于实际进行映射。

echo "cmdkey /add:storageaccount.file.core.windows.net /user:Azure\storageaccount /pass:serviceaccountpassword" | Out-File -Append -FilePath "C:\Credential.bat" -Encoding "ASCII"
echo "net use Z: \storageaccount.file.core.windows.net\share /persistent:yes" | Out-File -Append -FilePath "C:\Map.bat" -Encoding "ASCII"

然后我以要通过 PsExec 将网络文件共享映射到的帐户执行批处理文件。我不会详细介绍我是如何自动安装它的。

更多信息https://docs.microsoft.com/en-us/sysinternals/downloads/psexec

.\PsExec.exe -u "ServiceAccount" -p "ServiceAccountPassword" -h "C:\Credential.bat" /accepteula
.\PsExec.exe -u "ServiceAccount" -p "ServiceAccountPassword" -h "C:\Map.bat" /accepteula

现在,有一个棘手的问题花了我一段时间,感谢一篇非常有用的文章来解决。使用 Windows 10(2018 年 10 月)的 1809 构建版本。即使网络映射存在且凭据存在,网络映射也不会自动重新连接。我决定使用 Windows 10 1803 作为我的基本映像,它允许在启动 VM 时自动重新连接驱动器。

更多信息http://woshub.com/could-not-reconnect-mapped-network-drives/