2009-06-18 9 views
2

Ich versuche, den Windows-Anmeldebildschirm (winlogon) aus einer ausführbaren Datei zu entfernen, die von einem Dienst gestartet wurde. Der Dienst würde automatisch mit Windows starten und auf Befehle von einem anderen Computer warten. Wenn es einen Befehl empfängt, startet es eine exe, die cmd.exe unter einem bestimmten Benutzernamen startet.Windows-Anmeldebildschirm über einen Dienst entfernen

Der Dienst ist bereits vorhanden. Ich habe die Aufgabe, diese ausführbare Datei zu schreiben. Zur Zeit habe ich die ausführbare Datei (CmdLogin) geschrieben, die cmd.exe unter einem anderen Benutzer durch Aufrufe von LogonUserW, ImpersonateUser und CreateProcessWithLogonW startet. Ich gebe lpDesktop als "WinSta0 \ Default" an. Der einzige Haken ist, dass der Dienst unter einem Administratorkonto laufen muss (aber das ist ein anderes Problem).

Dies funktioniert einwandfrei, wenn von einer Eingabeaufforderung (auch unter Windows 7) aufgerufen. Dies funktioniert auch, wenn Sie vom Dienst aus aufgerufen werden, wenn sich ein Benutzer angemeldet hat und seinen Desktop anzeigt (wie beim Debuggen auf demselben Computer). Wie ich oben gesagt habe, besteht meine eigentliche Anforderung jedoch darin, dass dies auch dann funktioniert, wenn der Windows-Anmeldebildschirm angezeigt wird. Derzeit gibt die Exe einen richtigen Exit-Code, aber das Fenster erscheint nicht. Wenn sich der Benutzer jedoch anmeldet, sieht er das cmd-Fenster auf dem Desktop.

Eine Lösung, die ich fand, war "WinSta0 \ WinLogon" für lpDesktop anstelle von Standard zu verwenden. Ich muss es noch versuchen. Dies sieht jedoch so aus, als ob das cmd-Fenster direkt über dem Anmeldebildschirm angezeigt wird. Was ich wirklich brauche, ist die Benutzeranmeldung in winlogon zu emulieren und seinen tatsächlichen Desktop (und das cmd-Fenster) zu zeigen.

Ich schaute mich um und fand GINA und Winlogon Notification Packages. Sie erscheinen wie ein Overkill und ich bin mir nicht sicher, ob das den Zweck hier überhaupt lösen wird. Außerdem sind diese in Windows Vista veraltet, was mich glauben macht, dass es eine bessere und sauberere Methode gibt, um dies zu lösen.

Irgendwelche Vorschläge, was soll ich verwenden, um dies zu erreichen? Für den Datensatz befindet sich die ausführbare Datei in C# mit API-Aufrufen, die P/Invoke verwenden. Ich bin offen für die Verwendung einer C-DLL, die ich auch von dieser C# -Anwendung aufrufen kann.

Danke,
Husain

+0

Nun, die Begründung dafür ist, dass mein Client eine Anwendung benötigt, wo er verschiedene Benutzernamen und Kennwörter an Personen vergeben kann, um auf eine Windows-Workstation zuzugreifen, ohne den tatsächlichen Benutzernamen und das Passwort zu geben. Der Dienst, der auf der Arbeitsstation ausgeführt wird, wird den Benutzer für ihn remote anmelden, und der Benutzer wird weiterhin auf der Arbeitsstation über einen VNC-Client arbeiten. Das erschien mir ein wenig merkwürdig, da es so gut ist, als würde ich (fast) den Windows-Benutzer öffnen. Dies ist jedoch, was mein Kunde will. –

+0

Niemals die Dinge einfach halten, wenn Sie es auf die harte Tour machen können ... :-) Wie auch immer, Ihr Client möchte über eine VNC-Verbindung auf das lokale System zugreifen? Viel zu komplex. Es sollte einfachere Methoden geben, um den Benutzer einzuschränken. –

+0

Vielleicht sollten Sie Ihrem Kunden die "Seltsamkeit" dieses Designs erklären (klingt ein bisschen wie ein Technik-Manager mit einer Fixierung auf eine Technik, über die sie lesen). Ein Standard-Windows-Login mit "Passwort beim nächsten Login ändern" wurde für diese Art von Dingen entwickelt. Das Konto kann auch einen Ablauf haben, eingeschränkte Workstation-Liste, begrenzte Dateisystemberechtigungen usw. und dann einfach RDP/VNC verwenden. Einfach. – devstuff

Antwort

2

GINA hat in Vista/2008 von Credential Provider (nicht verfügbar in verwaltetem Code) abgelöst worden.

Ich weiß nicht, wie ich tun soll, was Sie brauchen, aber vielleicht ist dies ein Hinweis, um weiter auf den Spuren zu gehen.

Und für die Aufzeichnung scheint dies der falsche Weg, um das Problem anzugehen. Ich sehe einfach nicht, wie Sie eine Eingabeaufforderung unter einer automatischen Anmeldung ausführen müssen ... Warum nicht einen Dienst schreiben, um Ihre Aufgaben auszuführen, und ihn unter einer Reihe von dienstspezifischen Anmeldedaten ausführen lassen?

Ich habe nicht den Hintergrund zu Ihrem Problem, aber diese Beschreibung macht mich schaudern. :-)

[Update] Nun, als Antwort auf Ihren Kommentar. Ich würde sagen, dass das Schreiben eines GINA-Ersatzes für < = Windows 2003 oder eines benutzerdefinierten Anmeldungsanbieters für Vista/2008 + die beste Option wäre.

Sie können eine benutzerdefinierte Authentifizierung für seinen Berechtigungsnachweis bereitstellen und dann die Anmeldung nach Belieben zulassen oder verweigern.

Verwandte Themen