Como persistir credenciais em uma sessão remota do PowerShell?

13

Eu tenho um compartilhamento de arquivos do Azure e gostaria de usá-lo nas minhas VMs do Azure - depois de persistir as credenciais nas VMs com cmdkey e montar com o uso líquido. Isso foi testado executando esses comandos em uma sessão local do Powershell no Windows Server 2012 R2.

Mas preciso adicionar esta etapa a um script de implantação do Azure. Um script do Azure Powershell é executado no meu laptop, se conecta à assinatura do Azure e cria as VMs do zero, usando muitas variáveis.

Descobri que usar Invoke-Command para passar as variáveis ​​do script do Azure Powershell para uma sessão remota do Powershell na VM recém-criada.

$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)

E o erro:

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

Substituído por cmdkey / list para verificar a sintaxe, e não há erro.

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

Teve um problema semelhante (e não pôde corrigi-lo) com o Módulo do Windows Update PowerShell (Invoke-WUInstall), que é executado muito bem em uma sessão local do Powershell na VM, mas não é atualizado quando iniciado via Powershell remoto.

Alguma maneira de contornar este?

Razvan Zoitanu
fonte

Respostas:

2

Devido ao modo como o Windows lida com a autenticação, não é possível usar o CMDKEY para definir credenciais por meio de uma sessão remota do PowerShell, isso deve ser feito interativamente ao usar o CMDKEY.

Para citar Don Jones de um tópico que procura uma resposta semelhante à sua:

Essa é uma limitação do comando Cmdkey - não é realmente uma coisa do PowerShell. Mas está relacionado à maneira como o Remotig lida com credenciais. A sessão remota não recebe uma credencial, recebe um tíquete delegado, portanto, não há nenhum token para salvar. Tudo isso por design, e não algo que você possa reconfigurar.

Persistente13
fonte
2

Você pode usar o PsExec.exe do Sysinternal se não desejar usar a tarefa agendada. Normalmente, quando você inicia uma sessão do PowerShell, ela é executada no servicesprocesso (você pode confirmar isso executandoquery session comando no computador remoto) em vez do usuário local que falha no cmdkey.

Para superar isso, precisamos executar o cmdkey.exe no processo do usuário local, o que pode ser feito usando o PsExec.exe's -isinalizador

Execute o programa para que ele interaja com a área de trabalho da sessão especificada no sistema remoto. Se nenhuma sessão for especificada, o processo será executado na sessão do console.

Agora, o desafio é obter o ID da sessão do usuário local na máquina remota. Consegui isso executando o query sessioncomando que fornece uma lista de sessões ativas na máquina. Uma das soluções possíveis é -

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

} -ArgumentList ($user)

Aqui $usercontém o nome de usuário do usuário local no computador remoto.

Depois de obter o ID da sessão, você pode simplesmente executar

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

Nota:

  1. Pode haver maneiras melhores de obter o ID da sessão de um usuário na máquina remota.
  2. No momento, enquanto estiver executando o PsExec, estou novamente fazendo uma conexão com o sistema remoto, o que pode ser evitado (não testei).
  3. O usuário que executa o comando deve ter acesso de administrador na máquina remota.
Ankit Aggarwal
fonte