Как сохранить учетные данные в удаленном сеансе Powershell?

13

У меня есть общий доступ к файлам Azure, и я хотел бы использовать его на своих виртуальных машинах Azure - после сохранения учетных данных на виртуальных машинах с помощью cmdkey и монтирования с использованием сети. Это было проверено путем запуска этих команд в локальном сеансе Powershell на Windows Server 2012 R2.

Но мне нужно добавить этот шаг в сценарий развертывания Azure. Сценарий Azure Powershell запускается с моего ноутбука, подключается к подписке Azure и создает виртуальные машины с нуля, используя множество переменных.

Выяснили, как использовать Invoke-Command для передачи переменных из сценария Azure Powershell в удаленный сеанс Powershell на вновь созданной виртуальной машине.

$Session = New-PSSession -ConnectionUri $Uri -Credential $DomainCredential

$ScriptBlockContent = { 
Param ($Arg1,$Arg2,$Arg3)
cmdkey /add:$Arg1 /user:$Arg2 /pass:$Arg3}

Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($Share,$AccountName,$Key)

И ошибка:

PS C:\> Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($Share,$AccountName,$Key)
CMDKEY: Credentials cannot be saved from this logon session.

Заменяется на cmdkey / list для проверки синтаксиса, и ошибки нет.

PS C:\> Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent
Currently stored credentials:
* NONE *

Была похожая проблема (и не удалось ее устранить) с модулем Windows PowerShell Update (Invoke-WUInstall), который прекрасно работает в локальном сеансе Powershell на виртуальной машине, но не обновляется при запуске через удаленный Powershell.

Есть ли способ обойти это?

Разван Зойтану
источник

Ответы:

2

Из-за того, как Windows обрабатывает аутентификацию, невозможно использовать CMDKEY для установки учетных данных через удаленный сеанс PowerShell, это необходимо делать интерактивно при использовании CMDKEY.

Процитирую Дона Джонса из темы, которая ищет ответ, похожий на ваш:

Это ограничение команды Cmdkey, а не PowerShell. Но это связано с тем, как Remotig обрабатывает учетные данные. Удаленный сеанс на самом деле не получает учетные данные, он получает делегированный билет, поэтому токена для сохранения нет. Это все по замыслу, а не то, что вы можете перенастроить.

Persistent13
источник
2

Вы можете использовать PysExec.exe Sysinternal, если вы не хотите использовать запланированное задание. Обычно, когда вы запускаете сеанс PowerShell, он запускается в servicesпроцессе (вы можете подтвердить это, выполнив query sessionкоманду на удаленном компьютере) вместо локального пользователя, который отказывает cmdkey.

Чтобы преодолеть это, нам нужно запустить cmdkey.exe в локальном пользовательском процессе, что можно сделать с помощью PsExec.exe's -iфлага, который

Запустите программу, чтобы она взаимодействовала с рабочим столом указанного сеанса в удаленной системе. Если сеанс не указан, процесс выполняется в сеансе консоли.

Теперь задача состоит в том, чтобы получить идентификатор сеанса локального пользователя на удаленной машине. Я достиг этого, запустив query sessionкоманду, которая выдает список активных сессий на машине. Одним из возможных решений является -

$processId = Invoke-Command $session -ScriptBlock  {
param($user)
    $sessions = query session $user;
    return $sessions[1].split(" ", [System.StringSplitOptions]::RemoveEmptyEntries)[2];

} -ArgumentList ($user)

Здесь $userсодержится имя пользователя локального пользователя на удаленном компьютере.

Как только вы получите идентификатор сессии, вы можете просто выполнить

PsExec \\<computer_name> -u <local_user_name> -p <password> -h -i $processId cmdkey.exe /generic:testtt /user:userr /pass:pass

Замечания:

  1. Могут быть более эффективные способы получения идентификатора сеанса пользователя на удаленной машине.
  2. Прямо сейчас, во время работы PsExec, я снова устанавливаю соединение с удаленной системой, чего можно избежать (я не проверял).
  3. Пользователь, выполняющий команду, должен иметь доступ администратора на удаленном компьютере.
Анкит Аггарвал
источник