powershell 使用VM自定义扩展安装Azure文件时出现问题

3pvhb19x  于 2022-12-13  发布在  Shell
关注(0)|答案(2)|浏览(128)

我尝试在使用Powershell配置虚拟机时装载Azure文件共享。
我使用的是net use,其值是在单击文件共享中的“Connect”时门户中提供的。我还使用cmdkey保留了存储帐户凭据。
共享确实显示,但由于用户名或密码不正确而“断开连接”。
如果我RDP到服务器并自己运行脚本,则文件共享挂载不会出现问题。
我在脚本中添加了whoami,以查看调配虚拟机时脚本在什么上下文下运行,它显示为“nt authority\system”

wfypjpf4

wfypjpf41#

经过大量时间的搜索和尝试,以下是我最终所做的:

Powershell脚本

此脚本由VM扩展运行。它为文件共享添加凭据并装载驱动器。

警告:它必须由用户使用脚本运行。默认情况下,VM扩展作为系统运行。请参阅下面的解决方案。

param(
    [Parameter(Mandatory=$true)]
    [string]$FileShare,

    [Parameter(Mandatory=$true)]
    [string]$StorageAccountAccessKey,
    
    [Parameter(Mandatory=$true)]
    [string]$StorageAccount
)

# Save the password so the drive will persist on reboot
cmd.exe /C "cmdkey /add:`"${StorageAccount}.file.core.windows.net`" /user:`"localhost\${StorageAccount}`" /pass:`"${StorageAccountAccessKey}`""
# Mount the drive
net use "Z:" "\\${StorageAccount}.file.core.windows.net\${FileShare}" /persistent:yes

以其他用户身份执行脚本:普塞克

我最终使用psexec来执行上面的脚本,作为将要使用虚拟机并需要挂载驱动器的用户。它不是现成的,所以在运行脚本时需要下载它(见下文)。PsExec是PsTools套件的一部分。

VM扩展定义

为了在创建VM时运行脚本,我使用了bicep模板来定义VM扩展。第一个是下载powerhsell脚本的链接,第二个是指向psexec的exe的链接。我使用github托管这两个文件。它们将自动下载,并通过commandToExecute命令可用。下面定义了一些变量:accountNameaccountPassword是要使用该驱动器的用户的凭据。

resource vmMountDriveExtension 'extensions@2022-08-01' = {
    name: 'mountDriveExtension'
    location: location
    properties: {
      settings: any({
        fileUris: [
          'https://URL_TO_POWERSHELL_SCRIPT/mountDrive.ps1'
          'https://URL_TO_SELF_HOSTED_PSEXEC/PsExec.exe'
        ]
      })
      protectedSettings: any({
        commandToExecute: 'powershell -Command "Enable-PSRemoting -Force" ;.\\psexec -u ${accountName} -p ${accountPassword} -accepteula -h -i "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -File \${pwd}\\mountDrive.ps1 -FileShare ${fileShareName} -StorageAccountAccessKey ${storageAccount.listKeys().keys[0].value} -StorageAccount ${storageAccount.name}'
      })
      publisher: 'Microsoft.Compute'
      type: 'CustomScriptExtension'
      typeHandlerVersion: '1.10'
    }
  }
}
pexxcrt2

pexxcrt22#

据我所知,这是不可能的。要在此方案中访问Map的驱动器,需要将凭据(即存储帐户名称和密钥)存储在用于登录VM的用户帐户的凭据管理器存储中。
请参阅类似的question

相关问题