Advertisement
Guest User

Untitled

a guest
May 3rd, 2017
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.85 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. function RunAs(User, Password, Command: String): Integer;
  24. var  dwSize:        DWORD;
  25.      hToken:        THandle;
  26.      lpvEnv:        Pointer;
  27.      pi:            TProcessInformation;
  28.      si:            TStartupInfo;
  29.      szPath:        Array [0..MAX_PATH] of WideChar;
  30. begin
  31.  
  32.   ZeroMemory(@szPath, SizeOf(szPath));
  33.   ZeroMemory(@pi, SizeOf(pi));
  34.   ZeroMemory(@si, SizeOf(si));
  35.   si.cb:=SizeOf(TStartupInfo);
  36.   showmessage('1');
  37.   if LogonUser(PChar(User), nil, PChar(Password), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken) then
  38.   begin
  39.       showmessage('1.1');
  40.      if CreateEnvironmentBlock(lpvEnv, hToken, True) then
  41.      begin
  42.         showmessage('2');
  43.         dwSize:=SizeOf(szPath) div SizeOf(WCHAR);
  44.         if (GetCurrentDirectoryW(dwSize, @szPath) > 0) then
  45.         begin
  46.            if (CreateProcessWithLogon(PWideChar(WideString(User)), nil, PWideChar(WideString(Password)),
  47.                LOGON_WITH_PROFILE, nil, PWideChar(WideString(Command)), CREATE_UNICODE_ENVIRONMENT,
  48.                lpvEnv, szPath, si, pi)) then
  49.            begin
  50.               showmessage('3');
  51.               result:=ERROR_SUCCESS;
  52.               showmessage(inttostr(ERROR_SUCCESS));
  53.               WaitForSingleObject(pi.hProcess, INFINITE);
  54.               CloseHandle(pi.hProcess);
  55.               CloseHandle(pi.hThread);
  56.            end
  57.            else
  58.               result:=GetLastError;
  59.         end
  60.         else
  61.            result:=GetLastError;
  62.         DestroyEnvironmentBlock(lpvEnv);
  63.      end
  64.      else
  65.      begin
  66.         result:=GetLastError;
  67.         showmessage('GetLastError 1:'+inttostr(result));
  68.      end;
  69.      CloseHandle(hToken);
  70.   end
  71.   else
  72.   begin
  73.      result:=GetLastError;
  74.      showmessage('GetLastError 2:'+inttostr(result));
  75.   end;
  76.  
  77. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement