Проблемы монтирования файлов Azure с использованием пользовательских расширений VM
Я пытаюсь смонтировать общий файловый ресурс Azure при подготовке виртуальной машины с помощью Powershell.
я использую net use
со значениями, которые предоставляются на портале, когда я нажимаю "Подключиться" в общей папке. Я также сохранил учетные данные учетной записи хранения, используя cmdkey
,
Общий ресурс обнаруживается, но "отключен", поскольку имя пользователя или пароль неверны.
Если я RDP на сервер и запустить скрипт сам, общий доступ к файлам монтируется без проблем.
я добавил whoami
в моем сценарии, чтобы увидеть, в каком контексте выполняется сценарий при подготовке виртуальной машины, и он отображается как "nt полномочия \ система"
2 ответа
После долгих поисков и попыток, вот что я сделал:
Powershell-скрипт
Этот сценарий запускается расширением виртуальной машины. Он добавляет учетные данные для общего доступа к файлам и монтирует диск.
Предостережение : он должен запускаться пользователем с помощью скрипта. По умолчанию расширение виртуальной машины запускается как система. См. решение ниже.
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 для выполнения моего сценария выше в качестве пользователя, который собирается использовать виртуальную машину и нуждается в подключенном диске. Он недоступен из коробки, поэтому вам нужно будет загрузить его при запуске скрипта (см. ниже). PsExec является частью пакета PsTools.
Определение расширения виртуальной машины
Чтобы запустить сценарий при создании виртуальной машины, я использовал шаблон bicep для определения расширения виртуальной машины. Шаблон ссылается на два файла вfileUris
: первая — это ссылка на скачивание скрипта powerhsell, а вторая — ссылка на exe-файл psexec. Я использовал github для размещения обоих файлов. Они будут загружены автоматически и будут доступныcommandToExecute
команда. Определены некоторые переменные:accountName
иaccountPassword
являются учетными данными пользователя, который собирается использовать диск.
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'
}
}
}
Исходя из моих знаний, это невозможно. Чтобы получить доступ к подключенному диску в этом сценарии, вам нужно будет сохранить учетные данные (т. Е. Имя и ключ учетной записи хранения) в хранилище учетных данных диспетчера пользователей, который вы используете для входа в виртуальную машину.
Пожалуйста, обратитесь к этому похожему вопросу.