![]() |
CreateProcessAsUser: Wie Verbindung mit Netzwerk herstellen?
Hallo,
ich möchte aus einem Dienst heraus ein Programm starten, welches auf eine Netzwerkressource zugreifen soll. Das Ganze im Hintergrund und wenn nötig vor der Benutzeranmeldung. Dafür Nutze ich jetzt die Methode CreateProcessAsUser. Also nacheinander:
Delphi-Quellcode:
Kann mir wer sagen wo ich welchen Parameter ändern/hinzufügen muss um nun auch auf UNC-Pfade/Netzlaufwerke zugreifen zu können?
var
ltoken : Cardinal; LEnv : Pointer; pi : TProfileInfo; si : STARTUPINFO; pri : _PROCESS_INFORMATION; sil : TSecurityImpersonationLevel; begin LogonUser( 'Benutzer', '', 'Passwort', LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, ltoken ); FillChar(sil,SizeOf(TSecurityImpersonationLevel),#0); sil := SecurityIdentification; DuplicateTokenEx( ltoken, TOKEN_ALL_ACCESS, nil, sil, TokenPrimary, ltoken ); fillchar(pi,sizeof(TProfileInfo),#0); pi.dwSize:=sizeof(TProfileInfo); pi.lpUserName:='Benutzer'; LoadUserProfile( ltoken, pi ); CreateEnvironmentBlock( lenv, ltoken, false ); FillChar(pri,sizeof(_PROCESS_INFORMATION),#0); FillChar(si,sizeof(STARTUPINFO),#0); si.cb:=sizeof(si); si.lpReserved:=nil; si.lpDesktop:=PChar(''); si.lpTitle:=nil; si.dwFlags:=STARTF_FORCEOFFFEEDBACK; si.wShowWindow :=SW_SHOWNORMAL; si.cbReserved2:=0; si.lpReserved2:=nil; CreateProcessAsUser( ltoken, nil, 'D:\ProgrammPfad\Programm.exe', nil, nil, false, CREATE_UNICODE_ENVIRONMENT, lenv, nil, si, pri ); :angel: |
Re: CreateProcessAsUser: Wie Verbindung mit Netzwerk herstel
Es gibt keine Option, die das beeinflusst. UNC Pfade sind tokenrelativ. D.h. wenn ein Benutzer, angemeldet per LogonUser ein UNC Pfad erstellt, dann kann auch nur dieses Token darauf zugreifen. Daher haben die Leute in Vista alle das Problem, dass sie nach dem UAC Prompt, ihre UNC Pfade nicht mehr sehen bzw. darauf zugreifen können. Dieses Verhalten kann man irgendwo in der Registry abstellen.
SYSTEM Dienste haben keinen Zugriff auf das Netzwerk. Lösungen wären: 1. Benutzer personifizieren (ImpersonateLoggedOnUser) 2. Den Dienst als einen Benutzer sofort starten lassen 3. Den Dienst als NETWORK_SERVICE laufen lassen. Einen neuen Prozess zu starten ist eigentlich nicht notwendig wäre aber Alt. 4. PS. Dein Quelltext hat soviele Fehler und problematische Stellen, dass ich nur die JWSCL dringend empfehlen kann! |
Re: CreateProcessAsUser: Wie Verbindung mit Netzwerk herstel
Der Dienst selbst braucht auch keinen Zugriff auf das Netzwerk, das Programm das vom Dienst aufgerufen wird braucht diesen.
Zitat:
Schliesslich muss ich meinem Ausbilder erklären warum das so funktioniert und nicht anders. Einfach sagen"Die Komponente da kann das halt" reicht mir/meinem Ausbilder da nicht. |
Re: CreateProcessAsUser: Wie Verbindung mit Netzwerk herstel
Aufgrund meiner derzeit spärlichen Zeit kann ich nicht alle Probleme behandeln. Folgendes solltest du überdenken:
1. Die Fehlerüberprüfung gründlich überdenken 2. Die LogonUser API genau studieren : ![]() So steht da: Zitat:
4. Die erste Zeile ist nicht notwendig:
Delphi-Quellcode:
Warum darfst du kein Framework verwenden? Was ist dein Ziel? Willst du eine Anwendung bauen, oder willst du über die Security API etwas schreiben?
FillChar(sil,SizeOf(TSecurityImpersonationLevel),#0);
sil := SecurityIdentification; Teste mal denselben Ansatz mit interaktiven Logon und den UNC-Pfaden. Vllt funktioniert das schon. Und gib bescheid! |
Re: CreateProcessAsUser: Wie Verbindung mit Netzwerk herstel
OK, mit dem interaktiven Login klappt es, ich kann auf UNC-Pfade zugreifen.
Allerdings sind keine gemappten Laufwerke verfügbar :( |
Re: CreateProcessAsUser: Wie Verbindung mit Netzwerk herstel
Schlecht zu sagen, das müsste ich mal selbst ausprobieren.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz