verbinden unter anderem Account
-
Hallo,
ich habe folgendes Problem:
Ich muss ein Programm schreiben, mit dem ich auf einem Remote-Computer Dienste starten kann, Registry-Werte auslesen kann und lokale Gruppen ändern kann!
Dabei arbeitet man an dem loaklen Rechner mit dem Domänen-Account yyyyy; man hat aber auch einem Account, mit dem man auf allen Rechnern Administrator ist!
Das Programm wird nun aber auf dem lokalen Rechner unter dem "Arbeits-Account" yyyyy gestartet! Wie kann ich mich nun mit dem Remote-Computer "connecten" (sogsagt Administrator-Account und Passwort mitgeben) um die Aufgaen zu erfüllen! Gibt es da irgendeine API-Funktion?
-
- LogonUser
- ImpersonateLoggedOnUser
-
Ich hab was interessantes gefunden:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/security/starting_an_interactive_client_process_in_c__.aspHab nur Probleme beim kompilieren:
error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'AddAceToWindowStation' error C2501: 'BOOL' : Fehlende Speicherklasse oder Typspezifizierer fatal error C1004: Unerwartetes Dateiende gefundenBenutze VC 6
Bitte um Hilfe
-
Vielleicht hast Du vergessen <windows.h> einzubinden!?
PS: Hat aber mit dem OP nichts zu tun... da er ja keinen Prozess starten wollte...
-
Super,
die gwünschten Aufagben konnte ich mit den beiden Funkmtion LogonUser und ImpersonateLoggedOnUser lösen!
Nun zeigt sich aber leider folfender Nebeneffekt, den ich nicht verstehe und auch nicht weg bekomme!Ich verbinde mit der Funktion err=WNetAddConnection2(&NetResource,pw,us,0); noch eine Freigabe des Remote-Rechners mit dem selben Admin-Account! Das hat auch immer wunderbar geklappt! Seitdem ich aber zu Programmbeginn die oben genannten Funktione aufrufe, klappt das nicht mehr! Die Funktion err=WNetAddConnection2(&NetResource,pw,us,0); wird erfolgreich ausgeführt, aber die Freigabe nicht verbunden (wie gesagt, ich gebe der Funktion den gleichen Admin-Account mit, wie der Funktion Logonuser)!
Hat jemand einen Tip?
-
Ich bezweifle mal dass dies so geht, da Du Dich ja mit einem anderen Account angemeldet hast als derjenige der Eingeloggt ist... deshalb kann der eingeloggte Benutzer natürlich nicht darauf zugreifen, da er ja in einer ganz anderen Session arbeite...
Was willst Du eigentlich genau machen?
-
Was will ich genau machen:
ich habe eine Account der heißt als Beispiel "dieter" und ist zum normalen Arbeiten (Office, Mail, ...), dann gibt es für uns noch einen Account der heißt z.B. "Admin_Dieter"! Mit diesem sind wir auf allen Rechnern Administrator!
Nun müssen wir für ständig wiederholende Aufgaben die Standardfreigabe c$ verbinden, Registry-Werte auslesen, prüfen ob Dienste gestartet sind und eventuelle nachstarten sowie Anwender in lokale Gruppen aufnehmen! Da es ziemlich nervt, immer über "Netzlaufwerke verbinden" im Exporer gehen zu müssen und dabei ständig Nutzername und Passwort einzugeben (das gleiche gilt für Starten der regedit.exe bzw. Computerverwaltung compmgmt.msc als Admin mittels "Run as"), habe ich beschlossen ein Programm zu schreiben, welches die Aufgaben übernimmt! Die Account-Daten liegen dabei verschlüsselt auf der lokalen Fetsplatte im Profil von "Dieter"!
Das klappt auch z.T. alles prima!
Lasse ich das LogonUser und ImpersonateLoggedOnUser am Anfag des Programms weg, klappt das Verbinden der Freigabe mit der Funktion WNetAddConnection2, aber die anderen Aufgaben gehen nicht!
Rufe ich die Funktionen LogonUser und ImpersonateLoggedOnUser am Anfang auf, klappen die anderen Aufgaben, nur wird die Freigabe c$ des Remote-Rechners nicht verbunden, obwohl dieerr = WNetAddConnection2(&NetResource,pw,us,0); if (err == NO_ERROR) { MessageBox(NULL, "Verbunden", MB_OK); }erfolgreich und die Messagebox "Verbunden" auswirft (isse aber eben nicht)!
-
Wie gesagt, das Problem ist, dass Du hier zwei unterschiedliche Sessions benötigst bzw. hast... und da Du von der Logon-Session nicht mal das Profile geladen hast, wirst Du den Laufwerksbuchstaben nie sehen...
Mach doch das "WNetAddConnection2" im normalen Context und das andere im Context des anderen Benutzers. Zurück kommst Du ja immer mit "RevertToSelf()".
-
Hallo Jochen,
das muss ich mal hier sagen:
Du bist der Größte!!!
Klappt alles wunderbar!
-
Jo. *Unser* MVP für 1 Jahr

Btw antworte doch mal im Sandkasten pls!