Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.20;
Скачать: CL | DM;

Вниз

CreateUserProcess   Найти похожие ветки 

 
xCode ©   (2008-10-30 08:54) [0]

Доброго времени суток мастера!
Мне нужно запустить приложение от имени другого пользователя. Я скачал готовый модуль, текст которого приведен ниже:

unit xAdvAPI;

interface

uses
 Windows;
const
 LOGON_WITH_PROFILE = $00000001;
 LOGON_NETCREDENTIALS_ONLY = $00000002;
 LOGON_ZERO_PASSWORD_BUFFER = $80000000;

procedure CreateUserProcess(Command: string;
 const UserName: WideString;
 const Password: WideString;
 const Title:    WideString = "";
 const Domain:   WideString = "";
 LogonFlags: DWORD = LOGON_WITH_PROFILE
 );

function CreateProcessWithLogonW(const lpUsername: PWideChar;
 const lpDomain: PWideChar; const lpPassword: PWideChar;
 dwLogonFlags: DWORD; const lpApplicationName: PWideChar;
 lpCommandLine: PWideChar; dwCreationFlags: DWORD;
 lpEnvironment: Pointer; const lpCurrentDirectory: PWideChar;
 lpStartupInfo: PStartupInfo;
 lpProcessInfo: PProcessInformation): Boolean; stdcall;

implementation
uses
 SysUtils;
{$WARN SYMBOL_DEPRECATED OFF}
{ ADVAPI32.DLL functions }
type
 TCreateProcessWithLogonW =
   function(const lpUsername: PWideChar;
   const lpDomain: PWideChar; const lpPassword: PWideChar;
   dwLogonFlags: DWORD; const lpApplicationName: PWideChar;
   lpCommandLine: PWideChar; dwCreationFlags: DWORD;
   lpEnvironment: Pointer; const lpCurrentDirectory: PWideChar;
   lpStartupInfo: PStartupInfo;
   lpProcessInfo: PProcessInformation): Boolean; stdcall;

const
 DllName = "advapi32.dll";

var
 DllHandle: THandle;
 _CreateProcessWithLogonW: TCreateProcessWithLogonW;

function InitLib: Boolean;
begin
 if DllHandle = 0 then
   if Win32Platform = VER_PLATFORM_WIN32_NT then
   begin
     DllHandle := LoadLibrary(DllName);
     if DllHandle <> 0 then
     begin
       @_CreateProcessWithLogonW := GetProcAddress(DllHandle,
         "CreateProcessWithLogonW");
     end;
   end;
 Result := (DllHandle <> 0);
end;

function NotImplementedBool: Boolean;
begin
 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
 Result := false;
end;

function CreateProcessWithLogonW(const lpUsername: PWideChar;
 const lpDomain: PWideChar; const lpPassword: PWideChar;
 dwLogonFlags: DWORD; const lpApplicationName: PWideChar;
 lpCommandLine: PWideChar; dwCreationFlags: DWORD;
 lpEnvironment: Pointer; const lpCurrentDirectory: PWideChar;
 lpStartupInfo: PStartupInfo;
 lpProcessInfo: PProcessInformation): Boolean; stdcall;
begin
 if InitLib and Assigned(_CreateProcessWithLogonW) then
   Result := _CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword,
     dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags,
     lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInfo)
 else
   Result := NotImplementedBool;
end;

procedure CreateUserProcess(Command: string;
 const UserName: WideString;
 const Password: WideString;
 const Title:    WideString = "";
 const Domain:   WideString = "";
 LogonFlags: DWORD = LOGON_WITH_PROFILE
 );
var
 MyStartupInfo: STARTUPINFO;
 ProcessInfo: PROCESS_INFORMATION;
 CommandLine: array[0..512] of WideChar;
begin
 FillChar(MyStartupInfo, SizeOf(MyStartupInfo), 0);
 MyStartupInfo.cb := SizeOf(MyStartupInfo);
 StringToWideChar(Command, CommandLine,
   Sizeof(CommandLine) div SizeOf(WideChar));
 MyStartupInfo.lpTitle := PWideChar(Title);
 if not CreateProcessWithLogonW(PWideChar(UserName), PWideChar(Domain),
   PWideChar(Password), LogonFlags, nil,
   CommandLine, 0, nil, nil, @MyStartupInfo, @ProcessInfo)
 then
 begin
   RaiseLastWin32Error();
   Exit;
 end
 else
 begin
   CloseHandle(ProcessInfo.hProcess);
   CloseHandle(ProcessInfo.hThread);
 end;
end;

initialization
finalization
 if DllHandle <> 0 then
   FreeLibrary(DllHandle);
end.


Все хорошо работает за исключение того, что приложение не запускается если учетная запись не имеет пароля. У меня собственно вопрос: это вообще не возможно или я не правильно использую вызов ф-ции. С паролем я вызываю ф-цию следующим образом:
CreateUserProcess("notepad", "root", "pass", "", "");
Без пароля вызывал по разному (естесвенно предварительно убрав пароль с учетной записи):
CreateUserProcess("notepad", "root", "", "", "", LOGON_ZERO_PASSWORD_BUFFER );
и так
CreateUserProcess("notepad", "root", nil, "", "", LOGON_ZERO_PASSWORD_BUFFER );
и без LOGON_ZERO_PASSWORD_BUFFER вызывал, меняется только ошибка... Заранее спасибо!


 
kami ©   (2008-10-30 13:28) [1]

> меняется только ошибка

текст ошибки никакого значения, конечно, не имеет?...


 
apic   (2008-10-30 14:25) [2]

Попозже отпишусь точным текстом ошибки. Расчитывал, что кто-нибудь уже программировал подобную вещь и знает как правильно пользоваться этой ф-цией.


 
apic   (2008-10-30 14:25) [3]

Попозже отпишусь точным текстом ошибки. Расчитывал, что кто-нибудь уже программировал подобную вещь и знает как правильно пользоваться этой ф-цией.


 
apic   (2008-10-30 14:25) [4]

Попозже отпишусь точным текстом ошибки. Расчитывал, что кто-нибудь уже программировал подобную вещь и знает как правильно пользоваться этой ф-цией.


 
apic   (2008-10-30 14:25) [5]

Попозже отпишусь точным текстом ошибки. Расчитывал, что кто-нибудь уже программировал подобную вещь и знает как правильно пользоваться этой ф-цией.


 
Eraser ©   (2008-10-30 14:29) [6]

> [2] apic   (30.10.08 14:25)

тут правильней почитать справку, умные книжки, скачать нормальные примеры и попробовать самому.



Страницы: 1 вся ветка

Текущий архив: 2009.12.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
15-1255092813
Unknown user
2009-10-09 16:53
2009.12.20
Интересная задача


1-1229431109
Zilog
2008-12-16 15:38
2009.12.20
Как закрыть не своё диалоговое окно?


15-1255984915
DmitriyG.
2009-10-20 00:41
2009.12.20
Кто каким средством пользуется для создания Help?


11-1163789456
SKA1997
2006-11-17 21:50
2009.12.20
Форма прозрачная для кликов


6-1210916210
Layner
2008-05-16 09:36
2009.12.20
Как подавить ошибку подключения ClientSocket