Главная страница
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.01 c
2-1257319865
Андрей1982
2009-11-04 10:31
2009.12.20
Как обменять местами колонки в ListView?


1-1229178246
postedman
2008-12-13 17:24
2009.12.20
Объектный процедурный тип


1-1229068695
Андрей Пл
2008-12-12 10:58
2009.12.20
DBChart показать данный о точке!


2-1257101336
Norgan
2009-11-01 21:48
2009.12.20
Отображение кода функциональной клавиши


2-1256993435
Keba
2009-10-31 15:50
2009.12.20
Границы родительской формы для MDI