Windows XPe RDP save User Credentials
Hallo zusammen,
ich muss auf einem Windows XP embedded Thin Client von HP es irgendwie schaffen, dass direkt nach dem Start eine RDP Session auf einen Server gestartet wird ohne dass der Benutzer seine Anmeldedaten immer eingeben muss.
Nun ist mir aufgefallen, dass Windows XPe keine cmdkey.exe hat und daher die Passwörter nicht hinterlegen kann... Ich habe in ein paar Foren gesehen, dass ich die einfach aus einem Windows Srv 2003 herauskopieren kann und auf dem ThinClient einspielen kann - das werde ich versuchen im Laufe des Tages zu lösen.
Nun meine Frage: Ist es irgendwie möglich über ein Programm (vielleicht C#) eine RDP Session zu öffnen bei der ich die Benutzerdaten entweder als Variable deklariert habe oder diese aus einer Text Datei herausgelesen werden? Das Programm sollte natürlich nicht mit cmdkey.exe funktionieren - davon habe ich schon ziemlich viele im Internet gefunden.
Könnt ihr mir bitte helfen?
Viele Grüße ;)
ich muss auf einem Windows XP embedded Thin Client von HP es irgendwie schaffen, dass direkt nach dem Start eine RDP Session auf einen Server gestartet wird ohne dass der Benutzer seine Anmeldedaten immer eingeben muss.
Nun ist mir aufgefallen, dass Windows XPe keine cmdkey.exe hat und daher die Passwörter nicht hinterlegen kann... Ich habe in ein paar Foren gesehen, dass ich die einfach aus einem Windows Srv 2003 herauskopieren kann und auf dem ThinClient einspielen kann - das werde ich versuchen im Laufe des Tages zu lösen.
Nun meine Frage: Ist es irgendwie möglich über ein Programm (vielleicht C#) eine RDP Session zu öffnen bei der ich die Benutzerdaten entweder als Variable deklariert habe oder diese aus einer Text Datei herausgelesen werden? Das Programm sollte natürlich nicht mit cmdkey.exe funktionieren - davon habe ich schon ziemlich viele im Internet gefunden.
Könnt ihr mir bitte helfen?
Viele Grüße ;)
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 239294
Url: https://administrator.de/contentid/239294
Ausgedruckt am: 20.11.2024 um 08:11 Uhr
24 Kommentare
Neuester Kommentar
Hallo addamain,
also du könntest das Passwort mit einem Powershell-Script deinem Tresor hinzufügen:
In der letzten Zeile werden deine entsprechenden Credentials und der Servername an die Funktion übergeben.
Falls auf dem System noch kein Managment-Framework vorhanden ist, kannst du dies nachrüsten.
Auf dem XP-System kannst du die hinzugefügten Credentials ja mit
Wenn gewünscht lässt sich das ganze auch als Konsolen-Anwendung kompilieren wenn man das möchte.
Den entsprechenden Code dafür findest du hier: http://stackoverflow.com/questions/19410186/c-sharp-using-credwrite-to- ...
Grüße Uwe
also du könntest das Passwort mit einem Powershell-Script deinem Tresor hinzufügen:
function Add-Credentials {
param(
[parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$Server,
[parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$Username,
[parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$Password
)
$code = @"
[DllImport("Advapi32.dll", SetLastError=true, EntryPoint="CredWriteW", CharSet=CharSet.Unicode)]
public static extern bool CredWrite([In] ref Credential userCredential, [In] UInt32 flags);
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct Credential
{
public UInt32 flags;
public UInt32 type;
public IntPtr targetName;
public IntPtr comment;
public System.Runtime.InteropServices.ComTypes.FILETIME lastWritten;
public UInt32 credentialBlobSize;
public IntPtr credentialBlob;
public UInt32 persist;
public UInt32 attributeCount;
public IntPtr Attributes;
public IntPtr targetAlias;
public IntPtr userName;
}
"@
Add-Type -MemberDefinition $code -Namespace "ADVAPI32" -Name 'Util'
$cred = New-Object ADVAPI32.Util+Credential
$cred.flags = 0
$cred.type = 2
$cred.targetName = [System.Runtime.InteropServices.Marshal]::StringToCoTaskMemUni($Server)
$cred.userName = [System.Runtime.InteropServices.Marshal]::StringToCoTaskMemUni($username)
$cred.attributeCount = 0
#Erhalten der Credentials: 1 = Session / 2 = Local Machine / 3 = Enterprise
$cred.persist = 3
$cred.credentialBlobSize = [System.Text.Encoding]::Unicode.GetBytes($Password).length
$cred.credentialBlob = [System.Runtime.InteropServices.Marshal]::StringToCoTaskMemUni($Password)
$result = [ADVAPI32.Util]::CredWrite([ref]$cred,0)
return $result
}
Add-Credentials -Server 'Testserver' -Username 'DOMAIN\user123' -Password 'Passw0rd'
Falls auf dem System noch kein Managment-Framework vorhanden ist, kannst du dies nachrüsten.
Auf dem XP-System kannst du die hinzugefügten Credentials ja mit
control keymgr.dll
überprüfen.Wenn gewünscht lässt sich das ganze auch als Konsolen-Anwendung kompilieren wenn man das möchte.
Den entsprechenden Code dafür findest du hier: http://stackoverflow.com/questions/19410186/c-sharp-using-credwrite-to- ...
Grüße Uwe
Das musst du nachrüsten mit dem Management Framework, den Link hatte ich oben gepostet:
http://support.microsoft.com/kb/968929/de
Grüße Uwe
http://support.microsoft.com/kb/968929/de
Grüße Uwe
Ich habe dir gerade mal schnell eine Konsolen-EXE kompiliert die das selbe macht > Download hier.
Sie wird so auf der Konsole verwendet:
Sie benötigt NET-Framework 2.0
Grüße Uwe
Sie wird so auf der Konsole verwendet:
AddDomainCredentials.exe "SERVERNAME" "DOMAIN\USERNAME" "PASSWORD"
Grüße Uwe
Zitat von @addamain:
Ich muss dich noch einmal kurz was Fragen^^ Und zwar was genau muss ich an deinem geposteten Script anpassen?
nur die letzte Zeile ! Oben das sind nur die Parameter-Variablen die du mit der letzten Zeile an die Funktion übergibst.Ich muss dich noch einmal kurz was Fragen^^ Und zwar was genau muss ich an deinem geposteten Script anpassen?
Habe das Script auf Windows 7 x64 und XP getestet Passwort wird erfolgreich gespeichert... Windows 8.1 steht noch aus (-edit- gerade getestet geht einwandfrei)...
WICHTIG! Wenn du Sonderzeichen wie $ etc. in deinem Passwort hast musst du das Passwort mit einfachen Anführungszeichen umschließen
Auf meinem System Speichert er den Anmeldenamen aber das PW nicht
woraus folgerst du das das Passwort nicht gespeichert wurde ?WICHTIG! Wenn du Sonderzeichen wie $ etc. in deinem Passwort hast musst du das Passwort mit einfachen Anführungszeichen umschließen
ja aber das nutzt ja wieder deine cmdkey.exe die du ja nicht nutzen wolltest...
Zu deinem anderen Problem, es könnte sein das du Generische Anmeldeinformationen benötigst anstatt Windows Credentials, das musst du evaluieren. Dann muss
diese Zeile
so abgeändert werden:
Mal eine andere Frage, die eigentlich nicht zum Thema gehört: Wie kann ich aus der .ps1 Datei eine .exe Datei machen?
man kann wenn man den Code in C# umschreibt und dann mit Add-Type das Assembly kompiliert. Ich bau dir später mal was dazu ...Zu deinem anderen Problem, es könnte sein das du Generische Anmeldeinformationen benötigst anstatt Windows Credentials, das musst du evaluieren. Dann muss
diese Zeile
$cred.type = 2
$cred.type = 1
Na also .
So ich habe gerade mal eine EXE mit C# geschrieben die das Erstellen der Credentials und den Auto-Login in einer Konsolen-Anwendung zusammenfasst. Du kannst sie hier herunterladen:
Ich habe mal zwei Versionen erstellt, die eine zur Nutzung mit .NET 2.0 und die andere für .NET 4.0 (da Windows 8 standardmäßig das .NET 2.0 nicht installiert hat)
Die Credentials werden jeweils immer nur für die Session angelegt und sind bei Abmeldung vom Client-Rechner wieder weg.
Die Benutzung erfolgt folgendermaßen
Anstatt GENERIC kann auch WINDOWS verwendet werden , wenn das gewünscht ist. Zusätzlich können optionale RDP-Parameter für den Aufruf mitgegeben werden. Der Parameter /v:SERVER ist aber schon fest im Programm mit eingebaut, dieser darf also nicht angegeben werden.
Hier noch mal ein Beispielaufruf:
Habs hier mal mit Windows 8.1 erfolgreich getestet. Ist natürlich noch BETA aber wenn's das macht was du willst, freu dich
Viel Spaß.
Grüße Uwe
So ich habe gerade mal eine EXE mit C# geschrieben die das Erstellen der Credentials und den Auto-Login in einer Konsolen-Anwendung zusammenfasst. Du kannst sie hier herunterladen:
Ich habe mal zwei Versionen erstellt, die eine zur Nutzung mit .NET 2.0 und die andere für .NET 4.0 (da Windows 8 standardmäßig das .NET 2.0 nicht installiert hat)
Die Credentials werden jeweils immer nur für die Session angelegt und sind bei Abmeldung vom Client-Rechner wieder weg.
Die Benutzung erfolgt folgendermaßen
rdpautologin.exe "SERVER" "DOMAIN\User" "PASSWORD" GENERIC "OPTIONALE RDP-PARAMETER"
Hier noch mal ein Beispielaufruf:
rdpautologin.exe "ts-01" "DOMAIN\mmuster" "Passw0rd" GENERIC "/W:800 /H:600"
Habs hier mal mit Windows 8.1 erfolgreich getestet. Ist natürlich noch BETA aber wenn's das macht was du willst, freu dich
Viel Spaß.
Grüße Uwe
du musst natürlich hier http://www.microsoft.com/en-us/download/details.aspx?id=16818 die native Sprache deines XP Embedded auswählen !!
Ok habe bei der Sprachauswahl englisch ausgewählt und der hat wieder die Deutsche Datei heruntergeladen gehabt
Wenn du nicht lange genug wartest nachdem du die Auswahl geändert hast, passiert das beschriebene.Nun habe ich aber gleich auch schon das nächste Problem: Er will bzw. braucht SP3 - kann ich das Problemlos über Windows Updates installieren?
Steht hier alles wie du vorgehen musst:http://support.microsoft.com/kb/958255/de
Grüße Uwe
p.s. warum testest du nicht mal meine EXEs von oben ? Ich kann dir auch gerne den Quellcode schicken, wenn du mir nicht vertraust ...
Das Problem ist nur dass ich mir die PowerShell zum Beispiel in den Autostart legen kann und dann wird automatisch die RDP Session aufgebaut
öhm, wo ist das Problem? das kannst du mit der exe auch ... einfach eine Verknüpfung mit den entsprechenden Parametern anlegen in den Autostart packen,oder die Zeile in den einschlägigen Autostart-Registry-Einträgen hinterlegen,
oder in den Taskplaner packen
feddich !
Denke das Thema sollte jetzt gelöst sein. Den Beitrag dann bitte noch auf gelöst setzen, und die Lösungskommentare markieren. Merci.