Wie kann ich Anmeldeinformationen in einer Remote-Powershell-Sitzung beibehalten?

13

Ich besitze eine Azure-Dateifreigabe und möchte diese von meinen Azure-VMs verwenden, nachdem ich die Anmeldeinformationen auf den VMs mit cmdkey beibehalten und mit Netznutzung bereitgestellt habe. Dies wurde getestet, indem diese Befehle in einer lokalen Powershell-Sitzung unter Windows Server 2012 R2 ausgeführt wurden.

Ich muss diesen Schritt jedoch einem Azure-Bereitstellungsskript hinzufügen. Ein Azure Powershell-Skript wird auf meinem Laptop ausgeführt, stellt eine Verbindung zum Azure-Abonnement her und erstellt die VMs unter Verwendung vieler Variablen von Grund auf neu.

Es wurde herausgefunden, dass mit Invoke-Command die Variablen aus dem Azure Powershell-Skript an eine Remote-Powershell-Sitzung auf der neu erstellten VM übergeben werden.

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

Und der Fehler:

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

Durch cmdkey / list ersetzt, um die Syntax zu überprüfen, und es liegt kein Fehler vor.

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

Hatte ein ähnliches Problem (und konnte es nicht beheben) mit dem Windows Update PowerShell-Modul (Invoke-WUInstall), das in einer lokalen Powershell-Sitzung auf der VM einwandfrei ausgeführt wird, jedoch nicht aktualisiert wird, wenn es über Remote-Powershell gestartet wird.

Wie kann man dieses umgehen?

Razvan Zoitanu
quelle

Antworten:

2

Aufgrund der Art und Weise, wie Windows die Authentifizierung handhabt, ist es nicht möglich, CMDKEY zum Festlegen von Anmeldeinformationen über eine Remote-PowerShell-Sitzung zu verwenden. Bei Verwendung von CMDKEY muss dies interaktiv erfolgen.

Um Don Jones aus einem Thread zu zitieren, der nach einer Antwort ähnlich Ihrer sucht:

Das ist eine Einschränkung des Befehls Cmdkey - eigentlich keine PowerShell-Sache. Es hängt jedoch damit zusammen, wie Remotig mit Anmeldeinformationen umgeht. Die Remote-Sitzung erhält keinen Berechtigungsnachweis, sondern ein delegiertes Ticket, sodass kein Token zum Speichern vorhanden ist. Das ist alles beabsichtigt und nicht etwas, das Sie neu konfigurieren können.

Persistent13
quelle
2

Sie können Sysinternals PsExec.exe verwenden, wenn Sie den geplanten Task nicht verwenden möchten. Normalerweise wird beim Starten einer PowerShell-Sitzung diese ausgeführt services(Sie können dies bestätigen, indem Sie den query sessionBefehl auf dem Remotecomputer ausführen) und nicht der lokale Benutzer, bei dem cmdkey fehlschlägt.

Um dies zu überwinden, müssen wir cmdkey.exe im Prozess des lokalen Benutzers ausführen. Dies kann mithilfe von PsExec.exe's -iflag which erfolgen

Führen Sie das Programm so aus, dass es mit dem Desktop der angegebenen Sitzung auf dem fernen System interagiert. Wenn keine Sitzung angegeben ist, wird der Prozess in der Konsolensitzung ausgeführt.

Die Herausforderung besteht nun darin, die Sitzungs-ID des lokalen Benutzers auf dem Remotecomputer abzurufen. Ich habe dies durch Ausführen eines query sessionBefehls erreicht, der eine Liste der auf dem Computer aktiven Sitzungen enthält. Eine der möglichen Lösungen ist:

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

} -ArgumentList ($user)

Hier $userenthält den Benutzernamen des lokalen Benutzers auf dem entfernten Computer.

Sobald Sie die Sitzungs-ID erhalten haben, können Sie einfach ausführen

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

Hinweis:

  1. Es gibt bessere Möglichkeiten, die Sitzungs-ID eines Benutzers auf dem Remotecomputer abzurufen.
  2. Im Moment stelle ich beim Ausführen von PsExec erneut eine Verbindung zum Remote-System her, die vermieden werden kann (habe ich nicht getestet).
  3. Der Benutzer, der den Befehl ausführt, sollte über Administratorzugriff auf dem Remotecomputer verfügen.
Ankit Aggarwal
quelle