Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2009.12.20;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2009.12.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
15-1256237040
POOP
2009-10-22 22:44
2009.12.20
Есть ли от этого польза?


1-1229336430
Afonya
2008-12-15 13:20
2009.12.20
Прорисовка пункта меню своими руками


1-1228221387
Yozch1
2008-12-02 15:36
2009.12.20
не работает CTRL-C !!!!


2-1256792265
d@nger
2009-10-29 07:57
2009.12.20
Транзакция в TFIBdataset


2-1257157125
Rendal
2009-11-02 13:18
2009.12.20
Удаление ключа из реестра





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский