2010-10-12 15 views
20

Ich habe ein Powershell-Skript, das durch ein Automatisierungstool für mehrere Server ausgeführt wird. Es funktioniert problemlos auf Windows-Computern, da die Remoteaufrufe das Dienstkonto des Tools verwenden, ohne dass Anmeldeinformationen im Code angefordert oder angezeigt werden müssen. Dieses Skript läuft auch mit dem SharpSSH-Paket über SSH gegen Linux-Maschinen. SharpSSH verwendet nicht automatisch die Anmeldeinformationen des Powershell-Benutzers, sondern benötigt entweder einen Benutzernamen und ein Kennwort, eine RSA-Schlüsseldatei oder ein PSCredential-Objekt. Ich kann mithilfe von Get-Credential keine Anmeldeinformationen anfordern, da sie über das Automatisierungstool ausgeführt werden. Ich möchte den Benutzernamen und das Passwort im Code nicht offen legen oder einen RSA-Schlüssel da draußen sitzen lassen. Ich möchte ein PSCredential-Objekt vom aktuellen Powershell-Benutzer (dem Dienstkonto) erstellen. Wenn Sie versuchen, [System.Net.CredentialCache] :: DefaultNetworkCredentials anzuzeigen, wird ein Leerzeichen angezeigt, und [System.Security.Principal.WindowsIdentity] :: GetCurrent() stellt das Objekt oder die Informationen, die ich benötige, nicht bereit.Erhalte das Berechtigungsobjekt des aktuellen Benutzers in Powershell ohne Aufforderung

Hat jemand eine Methode zum Erstellen eines PSCredential-Objekts vom aktuellen Benutzer? Oder vielleicht eine ganz andere Alternative für dieses Problem?

Vielen Dank!

Antwort

14

Die Windows-API stellt die benötigten Informationen nicht zur Verfügung, weshalb Powershell nicht auf sie zugreifen kann. Es ist eine absichtliche Funktion des Sicherheitssubsystems. Die einzige Möglichkeit dafür besteht darin, dass die Linux-Maschinen dem aufrufenden Rechner vertrauen, beispielsweise indem sie sie einem Active Directory (oder einem beliebigen Kerberos-Setup) beitreten.

Abgesehen davon, müssen Sie diese Informationen irgendwie speichern und weitergeben.

Sie können den RSA-Schlüssel im Keystore des Benutzers speichern und zur Laufzeit extrahieren (mit den .NET Crypto/Keystore-Bibliotheken), sodass Sie den Schlüssel nicht mit dem Code speichern. Auf diese Weise würde der Schlüssel selbst durch das Betriebssystem geschützt und nur verfügbar sein, wenn der anrufende Benutzer authentifiziert wurde. Sie müssen noch eine Sache installieren, aber möglicherweise ist dies der einzige Weg, um das zu erreichen, was Sie anstreben.

+1

Ahh, das ist bedauerlich. Nach einigen Diskussionen und Nachforschungen werden wir uns mit dem RSA-Schlüssel beschäftigen. Es wird am Ende noch mehr in der Zukunft ermöglichen. Danke, Taylor! – Beege

+0

Sie sagen, wenn der Benutzer Teil von AD ist, können Sie ein Anmeldedatenobjekt erhalten; Ist das korrekt? Ich versuche dies (der Titel der Frage) unter Windows. – ryanwebjackson

3

Da Sie das Passwort im Klartext von einem Anmeldedatenobjekt erhalten können, bezweifle ich, dass Sie dies ohne Aufforderung erhalten können.

3

Wie verschlüsselt man das Passwort mit dem Verschlüsselungsschlüssel des Dienstkontos?

Ein kurzes Beispiel:

Run Powershell als das Dienstkonto, führen Sie den folgende und die Ausgabe in eine Textdatei speichern (oder bindet ich in dem Task-Aufruf geplant):

$String = '<PASSWORD>' 
ConvertFrom-SecureString -SecureString (ConvertTo-SecureString -String $String -AsPlainText -Force) 

Verwenden in Ihrer geplanten Aufgabe folgen, um das Passwort zu entschlüsseln und zu verwenden:

$EncryptedString = '<ENCRYPTED PASSWORD FROM ABOVE>' 
[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR((ConvertTo-SecureString -String $EncryptedString))) 

Das sollte den Trick tun. Sie können das verschlüsselte Passwort jedoch nicht auf einem anderen Computer wiederverwenden, oder wenn Sie aus irgendeinem Grund den lokalen Schlüsselspeicher zerstören :)

+0

Die secureString-Methode ist reversibel, daher ist das Passwort technisch nicht sicher. Ohne die Option -force erhalten Sie: "ConvertTo-SecureString: Das System kann keine Texteingabe schützen." – cmcginty