Jak zachować poświadczenia w zdalnej sesji PowerShell?


13

Mam Azure File Share i chciałbym użyć tego z moich maszyn wirtualnych platformy Azure - po utrwaleniu poświadczeń na maszynach wirtualnych za pomocą polecenia cmdkey i zamontowaniu przy użyciu sieci. Zostało to przetestowane przez uruchomienie tych poleceń w lokalnej sesji Powershell w systemie Windows Server 2012 R2.

Ale muszę dodać ten krok do skryptu wdrażania platformy Azure. Skrypt Azure Powershell uruchamia się z mojego laptopa, łączy się z subskrypcją platformy Azure i buduje maszyny wirtualne od zera, używając wielu zmiennych.

Zrozumiał, że można użyć Invoke-Command do przekazania zmiennych ze skryptu Powershell Azure do zdalnej sesji Powershell na nowo utworzonej maszynie wirtualnej.

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

I błąd:

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

Zamieniono na cmdkey / list, aby sprawdzić składnię, i nie ma błędu.

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

Miał podobny problem (i nie mógł go naprawić) z modułem Windows Update PowerShell Module (Invoke-WUInstall), który działa dobrze w lokalnej sesji Powershell na maszynie wirtualnej, ale nie aktualizuje się po uruchomieniu za pomocą zdalnego Powershell.

Jest jakiś sposób na obejście tego?

Odpowiedzi:


2

Ze względu na sposób, w jaki system Windows obsługuje uwierzytelnianie, nie można używać CMDKEY do ustawiania poświadczeń za pomocą zdalnej sesji PowerShell, należy to zrobić interaktywnie podczas korzystania z CMDKEY.

Cytując Dona Jonesa z wątku szukającego odpowiedzi podobnej do twojej:

Jest to ograniczenie polecenia Cmdkey - nie jest to tak naprawdę sprawa PowerShell. Jest to jednak związane ze sposobem, w jaki Remotig obsługuje dane uwierzytelniające. Sesja zdalna nie uzyskuje poświadczenia, otrzymuje bilet delegowany, więc nie ma żadnego tokena do zapisania. To wszystko zgodnie z projektem, a nie coś, co można zmienić.


2

Możesz użyć narzędzia PsExec.exe Sysinternal, jeśli nie chcesz korzystać z zaplanowanego zadania. Zwykle po uruchomieniu sesji programu PowerShell jest ona uruchamiana w servicesprocesie (można to potwierdzić, uruchamiając query sessionpolecenie na komputerze zdalnym) zamiast użytkownika lokalnego, który nie wykonał polecenia cmdkey.

Aby temu zaradzić, musimy uruchomić cmdkey.exe w procesie użytkownika lokalnego, co można zrobić za pomocą PsExec.exe's -iflagi, która

Uruchom program, aby współdziałał z pulpitem określonej sesji w systemie zdalnym. Jeśli nie określono żadnej sesji, proces jest uruchamiany w sesji konsoli.

Teraz wyzwaniem jest uzyskanie identyfikatora sesji lokalnego użytkownika na zdalnym komputerze. Osiągnąłem to, uruchamiając query sessionpolecenie, które daje listę sesji aktywnych na komputerze. Jednym z możliwych rozwiązań jest -

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

} -ArgumentList ($user)

Tutaj $userzawiera nazwę użytkownika lokalnego na komputerze zdalnym.

Gdy otrzymasz identyfikator sesji, możesz po prostu wykonać

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

Uwaga:

  1. Mogą istnieć lepsze sposoby uzyskania identyfikatora sesji użytkownika na zdalnym komputerze.
  2. W tej chwili, podczas uruchamiania PsExec, ponownie nawiązuję połączenie ze zdalnym systemem, którego można uniknąć (nie testowałem).
  3. Użytkownik uruchamiający polecenie powinien mieć dostęp administratora na komputerze zdalnym.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.