addamain
Goto Top

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

Content-ID: 239294

Url: https://administrator.de/contentid/239294

Ausgedruckt am: 20.11.2024 um 08:11 Uhr

colinardo
Lösung colinardo 27.05.2014, aktualisiert am 28.05.2014 um 15:20:30 Uhr
Goto Top
Hallo addamain,
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'  
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 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
addamain
addamain 27.05.2014 um 11:04:14 Uhr
Goto Top
Hat Windows XP embedded eine Powershell vorinstalliert oder muss die auch noch nachinstalliert werden?
colinardo
colinardo 27.05.2014 um 11:05:53 Uhr
Goto Top
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
addamain
addamain 27.05.2014 um 11:07:48 Uhr
Goto Top
Super vielen Dank. Ich werde das nach der Mittagspause mal testen und gebe dir dann Bescheid ;)
colinardo
Lösung colinardo 27.05.2014, aktualisiert am 28.05.2014 um 15:20:35 Uhr
Goto Top
Ich habe dir gerade mal schnell eine Konsolen-EXE kompiliert die das selbe macht > Download hier.

Sie wird so auf der Konsole verwendet:
AddDomainCredentials.exe "SERVERNAME" "DOMAIN\USERNAME" "PASSWORD"
Sie benötigt NET-Framework 2.0

Grüße Uwe
addamain
addamain 27.05.2014 um 12:28:22 Uhr
Goto Top
Ich muss dich noch einmal kurz was Fragen^^ Und zwar was genau muss ich an deinem geposteten Script anpassen?

In der letzten Zeile muss ich "Testserver", "DOMAIN\user123" und "Passw0rd" anpassen - wie sieht es mit den Zeilen 3-5 aus ("$Server", "$Username" und "$Password")?

Danke für deine Hilfe.
colinardo
Lösung colinardo 27.05.2014, aktualisiert am 28.05.2014 um 15:35:30 Uhr
Goto Top
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.
colinardo
colinardo 27.05.2014 aktualisiert um 12:39:54 Uhr
Goto Top
Nur noch zur Info. Im Moment ist die Dauerhaftigkeit der Credentials auf "LOCAL MACHINE" festgelegt. Wenn "ENTERPRISE" benötigt wird (musst du testen was du brauchst) muss die Zeile 38 so abgeändert werden (habe das oben abgeändert)
$cred.persist = 3
Grüße Uwe
addamain
addamain 27.05.2014 um 12:53:43 Uhr
Goto Top
Ok, das schaue ich mir an. Ich teste das gerade auf meinem Windows 8.1 System weil der Thin Client mit Windows XPe die ganze Zeit wieder ausgeht (defekt). Ich schaue mal ob ich einen anderen organisiert bekomme.

Auf meinem System Speichert er den Anmeldenamen aber das PW nicht - ist das bei Windows XPe dann anderst?
colinardo
colinardo 27.05.2014 aktualisiert um 13:01:51 Uhr
Goto Top
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)...
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
addamain
addamain 27.05.2014 um 13:02:55 Uhr
Goto Top
Wenn ich das .ps1 Skript ausführe kommt als Rückgabewert "True". Wenn ich dann eine RDP auf den Server starte, zeigt er mir den richtigen Benutzernamen an, nach kurzem geht aber ein Fenster auf in dem er wieder nach den Benutzerdaten fragt.

Domäne, Benutzername, Server IP und Passwort habe ich überprüft und die Daten passen. Hast du noch eine Idee? Habe es gerade auch noch auf meinem virtuellen Windows 7 Client getestet, da habe ich genau das gleiche Problem...
colinardo
Lösung colinardo 27.05.2014, aktualisiert am 28.05.2014 um 15:35:14 Uhr
Goto Top
hast du mal wie oben geschrieben die Persistence auf "Unternehmen" gesetzt ? :
$cred.persist = 3
Kann das mit dem Auto-Connect gerade nicht testen, werde ich später mal machen ...
hast du Sonderzeichen wie $ in deinem Passwort? dann siehe vorheriger Kommentar..
addamain
addamain 27.05.2014 aktualisiert um 13:20:08 Uhr
Goto Top
Nein, habe das Passwort zum testen auf Start123 gesetzt. Ich habe gerade von einem Kollegen ein anderes Script bekommen, was an sich gar nicht schlecht aussieht. Es öffnet direkt eine RDP Session mit den im Script hinterlegten Benutzer- und Serverdaten.

Mal eine andere Frage, die eigentlich nicht zum Thema gehört: Wie kann ich aus der .ps1 Datei eine .exe Datei machen?

Hier mal nach das Script von meinem Kollegen:

$servername = "IPoderServername"  
$username = "domäne\administrator"  
$passwort = "Start123"  

Function Open-RDPSession($Server,$User,$Password)
{
    Write-Host "- saving RDP credential" -ForegroundColor green  
    cmdkey /generic:$server /user:$user /pass:$Password
    write-Host "- opening RDP" -ForegroundColor green  
    mstsc /v:$Server /W:800 /h:600
}

Open-RDPSession $servername $username $passwort 
colinardo
Lösung colinardo 27.05.2014, aktualisiert am 28.05.2014 um 15:35:10 Uhr
Goto Top
ja aber das nutzt ja wieder deine cmdkey.exe die du ja nicht nutzen wolltest...

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 
so abgeändert werden:
$cred.type = 1
addamain
addamain 27.05.2014 um 13:32:07 Uhr
Goto Top
Top, die letzten 3 Zeilen waren es^^ Jetzt funktioniert das. Jetzt schaue ich mal dass ich den Thin Client einfach mal wieder zum laufen bekomme und werde das ganze dann nochmal testen wenn ich PS installiert habe.

Vielen Dank face-smile
colinardo
Lösung colinardo 27.05.2014, aktualisiert am 28.05.2014 um 15:35:07 Uhr
Goto Top
Na also face-wink.

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"
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:
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 face-wink

Viel Spaß.
Grüße Uwe
addamain
addamain 28.05.2014 um 13:36:16 Uhr
Goto Top
Hey ;)

Ich habe das Powershell Skript mal noch ein bisschen angepasst und er öffnet mir jetzt direkt auch noch die RDP Session nach der Ausführung. Jetzt wollte ich das ganze auf dem Windows XPe Thin Client testen und muss erst noch PS installieren. Ich habe von dieser Seite: http://support.microsoft.com/kb/968929/de diese Datei heruntergeladen: "Downloaden Sie Windows Management Framework Core für Windows XP und Windows Embedded-Paket jetzt." Da wird man auf KB968930 weitergeleitet. Ich habe die .exe Heruntergeladen und auf unser NAS abgelegt. Nun habe ich das Setup auf dem Thin Client gestartet und dann kommt die Meldung, dass die Sprache des OS nicht mit der des Updates übereinstimmt...

Hast du da eine Idee? Es gibt bei diesen HP Thin Clients anscheinend so nen Schreibschutz den man entsperren kann - könnte das da dran liegen?
colinardo
colinardo 28.05.2014 aktualisiert um 13:54:20 Uhr
Goto Top
Zitat von @addamain:
Meldung, dass die Sprache des OS nicht mit der des Updates übereinstimmt...
du musst natürlich hier http://www.microsoft.com/en-us/download/details.aspx?id=16818 die native Sprache deines XP Embedded auswählen !!
addamain
addamain 28.05.2014 um 13:44:10 Uhr
Goto Top
Ok habe bei der Sprachauswahl englisch ausgewählt und der hat wieder die Deutsche Datei heruntergeladen gehabt.. Mit deinem Link aber hat es geklappt - vielen Dank face-smile

Nun habe ich aber gleich auch schon das nächste Problem: Er will bzw. braucht SP3 - kann ich das Problemlos über Windows Updates installieren?
colinardo
colinardo 28.05.2014 aktualisiert um 13:51:06 Uhr
Goto Top
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
colinardo
colinardo 28.05.2014 aktualisiert um 13:56:29 Uhr
Goto Top
p.s. warum testest du nicht mal meine EXEs von oben ? Ich kann dir auch gerne den Quellcode schicken, wenn du mir nicht vertraust ...
addamain
addamain 28.05.2014 um 14:01:03 Uhr
Goto Top
Ums Vertrauen gehts da ned ;) Das ist schon daDas Problem ist nur dass ich mir die PowerShell zum Beispiel in den Autostart legen kann und dann wird automatisch die RDP Session aufgebaut Das wäre super wenn das funktioniert ;)
colinardo
colinardo 28.05.2014 aktualisiert um 14:08:28 Uhr
Goto Top
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.
addamain
addamain 28.05.2014 um 15:20:11 Uhr
Goto Top
Gut Alles klar, dann bastel ich mal ;) Vielen Dank für deine 1. klassige Unterstützung ;)