Comment conserver les informations d'identification dans une session Powershell distante?

13

J'ai un partage de fichiers Azure et j'aimerais l'utiliser à partir de mes machines virtuelles Azure - après avoir conservé les informations d'identification sur les machines virtuelles avec cmdkey et monté avec une utilisation nette. Cela a été testé en exécutant ces commandes dans une session Powershell locale sur Windows Server 2012 R2.

Mais je dois ajouter cette étape à un script de déploiement Azure. Un script Azure Powershell s'exécute à partir de mon ordinateur portable, se connecte à l'abonnement Azure et crée les machines virtuelles à partir de zéro, en utilisant de nombreuses variables.

Conçu pour utiliser Invoke-Command pour passer les variables du script Azure Powershell à une session Powershell distante sur la machine virtuelle nouvellement créée.

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

Et l'erreur:

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

Remplacé par cmdkey / list pour vérifier la syntaxe, et il n'y a pas d'erreur.

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

A eu un problème similaire (et n'a pas pu le résoudre) avec le module Windows Update PowerShell (Invoke-WUInstall), qui fonctionne très bien sur une session Powershell locale sur la machine virtuelle, mais ne se met pas à jour lorsqu'il est démarré via Powershell distant.

Une façon de contourner celui-ci?

Razvan Zoitanu
la source

Réponses:

2

En raison de la façon dont Windows gère l'authentification, il n'est pas possible d'utiliser CMDKEY pour définir les informations d'identification via une session PowerShell distante, cela doit être fait de manière interactive lors de l'utilisation de CMDKEY.

Pour citer Don Jones à partir d'un fil à la recherche d'une réponse similaire à la vôtre:

C'est une limitation de la commande Cmdkey - pas vraiment une chose PowerShell. Mais cela est lié à la façon dont Remotig gère les informations d'identification. La session distante ne reçoit pas réellement d'informations d'identification, elle obtient un ticket délégué, il n'y a donc pas de jeton à enregistrer réellement. C'est tout par conception, et ce n'est pas quelque chose que vous pouvez reconfigurer.

Persistant13
la source
2

Vous pouvez utiliser PsExec.exe de Sysinternal si vous ne souhaitez pas utiliser la tâche planifiée. Normalement, lorsque vous démarrez une session PowerShell, elle s'exécute dans le servicesprocessus (vous pouvez le confirmer en exécutant la query sessioncommande sur l'ordinateur distant) au lieu de l'utilisateur local qui échoue cmdkey.

Pour surmonter cela, nous devons exécuter cmdkey.exe dans le processus de l'utilisateur local, ce qui peut être fait en utilisant un PsExec.exe's -iindicateur qui

Exécutez le programme afin qu'il interagisse avec le bureau de la session spécifiée sur le système distant. Si aucune session n'est spécifiée, le processus s'exécute dans la session de console.

Maintenant, le défi consiste à obtenir l'ID de session de l'utilisateur local sur la machine distante. J'ai réalisé cela en exécutant la query sessioncommande qui donne une liste des sessions actives sur la machine. L'une des solutions possibles est -

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

} -ArgumentList ($user)

Voici $userle nom d'utilisateur de l'utilisateur local sur l'ordinateur distant.

Une fois que vous avez obtenu l'ID de session, vous pouvez simplement exécuter

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

Remarque:

  1. Il peut y avoir de meilleures façons d'obtenir l'ID de session d'un utilisateur sur la machine distante.
  2. En ce moment, tout en exécutant PsExec, je fais à nouveau une connexion avec le système distant qui peut être évité (je n'ai pas testé).
  3. L'utilisateur exécutant la commande doit avoir un accès administrateur sur la machine distante.
Ankit Aggarwal
la source