Advertisement
Guest User

Untitled

a guest
May 4th, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.59 KB | None | 0 0
  1. function CreateProcessWithLogon(lpUsername: PWideChar;
  2.                                 lpDomain: PWideChar;
  3.                                 lpPassword: PWideChar;
  4.                                 dwLogonFlags: DWORD;
  5.                                 lpApplicationName: PWideChar;
  6.                                 lpCommandLine: PWideChar;
  7.                                 dwCreationFlags: DWORD;
  8.                                 lpEnvironment: Pointer;
  9.                                 lpCurrentDirectory: PWideChar;
  10.                                 var lpStartupInfo: TStartupInfo;
  11.                                 var lpProcessInfo: TProcessInformation): BOOL; stdcall;
  12.                                 external 'advapi32' name 'CreateProcessWithLogonW';
  13.  
  14. function CreateEnvironmentBlock(var lpEnvironment: Pointer;
  15.                                 hToken: THandle;
  16.                                 bInherit: BOOL): BOOL; stdcall; external 'userenv';
  17.  
  18. function DestroyEnvironmentBlock(pEnvironment: Pointer): BOOL; stdcall; external 'userenv';
  19.  
  20. const
  21.   LOGON_WITH_PROFILE   =  $00000001;
  22.  
  23.  
  24. function RunAs(User, Password, Command: String): Integer;
  25. var  dwSize:        DWORD;
  26.      hToken:        THandle;
  27.      lpvEnv:        Pointer;
  28.      pi:            TProcessInformation;
  29.      si:            TStartupInfo;
  30.      szPath:        Array [0..MAX_PATH] of WideChar;
  31.      ProcInfo : TProcessInformation;
  32. begin
  33.  
  34.   ZeroMemory(@szPath, SizeOf(szPath));
  35.   ZeroMemory(@pi, SizeOf(pi));
  36.   ZeroMemory(@si, SizeOf(si));
  37.   si.cb:=SizeOf(TStartupInfo);
  38.   if LogonUser(PChar(User), nil, PChar(Password), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken) then
  39.   begin
  40.      if CreateEnvironmentBlock(lpvEnv, hToken, True) then
  41.      begin
  42.         dwSize:=SizeOf(szPath) div SizeOf(WCHAR);
  43.         if (GetCurrentDirectoryW(dwSize, @szPath) > 0) then
  44.         begin
  45.            if (CreateProcessWithLogon(PWideChar(WideString(User)), nil, PWideChar(WideString(Password)),
  46.                LOGON_WITH_PROFILE, nil, PWideChar(WideString(Command)), CREATE_UNICODE_ENVIRONMENT,
  47.                lpvEnv, szPath, si, pi)) then
  48.            begin
  49.               result:=ERROR_SUCCESS;
  50.               WaitForSingleObject(ProcInfo.hProcess, INFINITE);
  51.               CloseHandle(pi.hProcess);
  52.               CloseHandle(pi.hThread);
  53.            end
  54.            else
  55.               result:=GetLastError;
  56.         end
  57.         else
  58.            result:=GetLastError;
  59.         DestroyEnvironmentBlock(lpvEnv);
  60.      end
  61.      else
  62.         result:=GetLastError;
  63.      CloseHandle(hToken);
  64.   end
  65.   else
  66.      result:=GetLastError;
  67.  
  68. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement