Форум: "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