Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CreateProcessAsUser: Wie Verbindung mit Netzwerk herstellen? (https://www.delphipraxis.net/118931-createprocessasuser-wie-verbindung-mit-netzwerk-herstellen.html)

Angel4585 18. Aug 2008 07:31


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:
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
);
Kann mir wer sagen wo ich welchen Parameter ändern/hinzufügen muss um nun auch auf UNC-Pfade/Netzlaufwerke zugreifen zu können?

:angel:

Dezipaitor 18. Aug 2008 10:12

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!

Angel4585 18. Aug 2008 11:32

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:

Zitat von Dezipaitor
PS.
Dein Quelltext hat soviele Fehler und problematische Stellen, dass ich nur die JWSCL dringend empfehlen kann!

nun da ich mich weiterentwickeln möchte würde mich eine Korrektur mit einer Erklärung was ich warum falsch mache mehr interessieren als eine fertige Lösung :D
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.

Dezipaitor 18. Aug 2008 14:02

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 : http://msdn.microsoft.com/en-us/library/aa378184.aspx
So steht da:
Zitat:

The LOGON32_LOGON_NETWORK logon type is fastest, but it has the following limitations:
...
* If you convert the token to a primary token and use it in CreateProcessAsUser to start a process, the new process cannot access other network resources, such as remote servers or printers, through the redirector. An exception is that if the network resource is not access controlled, then the new process will be able to access it.
3. LogonUser benötigt immer das Passwort des Benutzers. D.h. du musst es speichern. Das muss gründlich überlegt werden, wo und wie.

4. Die erste Zeile ist nicht notwendig:
Delphi-Quellcode:
  FillChar(sil,SizeOf(TSecurityImpersonationLevel),#0);
  sil := SecurityIdentification;
Warum darfst du kein Framework verwenden? Was ist dein Ziel? Willst du eine Anwendung bauen, oder willst du über die Security API etwas schreiben?

Teste mal denselben Ansatz mit interaktiven Logon und den UNC-Pfaden. Vllt funktioniert das schon. Und gib bescheid!

Angel4585 28. Aug 2008 10:01

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 :(

Dezipaitor 28. Aug 2008 10:33

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 18:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz