Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
ВнизCreateProcessAsUser Найти похожие ветки
← →
Jay1982 © (2005-01-25 16:11) [0]Кто-нибудь знает как правильно оформить CreateProcessAsUser?
Пишу так:
var
handle: THandle;
stinfo: STARTUPINFO;
prinfo: PROCESS_INFORMATION;
LogonUser("user", nil, "password", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, handle);
GetStartupInfo(stinfo);
CreateProcessAsUser(handle, "c:\program.exe", nil, nil, nil, true, CREATE_DEFAULT_ERROR_MODE, nil, nil, stinfo, prinfo)
GetLastError выдаёт ошибку 1314
← →
kaZaNoVa © (2005-01-25 16:28) [1]Игорь Шевченко как-то давал такой код, может поможет ..
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfMain = class(TForm)
Button: TButton;
procedure ButtonClick(Sender: TObject);
end;
var
fMain: TfMain;
implementation
uses
HSAdvApi;
{$R *.dfm}
procedure TfMain.ButtonClick(Sender: TObject);
begin
MyCreateProcess();
end;
procedure TfMain.MyCreateProcess;
const
UserName : WideString = "TESTUSER";
Password : WideString = "testuser";
ConstCommandLine : String = "CMD.EXE";
Title : WideString = "Test process";
Domain : WideString = "WORKGROUP";
var
MyStartupInfo : STARTUPINFO;
ProcessInfo : PROCESS_INFORMATION;
CommandLine : array[0..512] of WideChar;
begin
FillChar(MyStartupInfo, SizeOf(MyStartupInfo), 0);
MyStartupInfo.cb := SizeOf(MyStartupInfo);
StringToWideChar(ConstCommandLine, CommandLine,
Sizeof(CommandLine) div SizeOf(WideChar));
MyStartupInfo.lpTitle := PWideChar(Title);
if not CreateProcessWithLogonW (PWideChar(UserName), PWideChar(Domain),
PWideChar(Password), LOGON_WITH_PROFILE, nil,
CommandLine, 0, nil, nil, @MyStartupInfo, @ProcessInfo) then
RaiseLastWin32Error()
else begin
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end;
end;
end.
unit HSAdvApi;
interface
uses
Windows;
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;
const
LOGON_WITH_PROFILE = $00000001;
LOGON_NETCREDENTIALS_ONLY = $00000002;
LOGON_ZERO_PASSWORD_BUFFER = $80000000;
implementation
uses
SysUtils;
{ 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;
initialization
finalization
if DllHandle <> 0 then
FreeLibrary(DllHandle);
end.
← →
Jay1982 © (2005-01-25 16:34) [2]Щас немного занят, обязательно проверю позже, большое спасибо.
← →
Набережных С. (2005-01-25 17:19) [3]1314 - ERROR_PRIVILEGE_NOT_HELD
У маркера процесса нет или не включена привилегия SE_TCB_NAME.
← →
Jay1982 © (2005-01-25 17:28) [4]А как её включить если не секрет?
← →
kaZaNoVa © (2005-01-25 17:33) [5]Jay1982 © (25.01.05 16:11)
> GetLastError выдаёт ошибку 1314
советую юзать так:MessageBox(0,Pchar(SysErrorMessage(GetLastError)),Pchar("Ошибка # "+IntToStr(GetLastError)),0);
← →
kaZaNoVa © (2005-01-25 17:34) [6]Jay1982 © (25.01.05 17:28) [4]
> А как её включить если не секрет?
не пробовал, но может это поможет:
function SetDebugPriv: Boolean;
var
Token: THandle;
tkp: TTokenPrivileges;
begin
Result := false;
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
if LookupPrivilegeValue(nil, PChar("SE_TCB_NAME"), tkp.Privileges[0].Luid) then
begin
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Result := AdjustTokenPrivileges(Token, false, tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^);
end;
end;
end;
← →
kaZaNoVa © (2005-01-25 17:35) [7]kaZaNoVa © (25.01.05 17:34) [6]
этот код я обычно для SeDebugPrivilege юзаю)) (она мне часто нужна))))))))))
← →
Jay1982 © (2005-01-25 17:48) [8]Понятно, ещё раз спасибо
← →
Набережных С. (2005-01-25 18:02) [9]Вообще-то в ХР она вроде не требуется...
Но раз уж ошибка есть, надо попробовать. По умалчанию, такой привилегией обладает только система, поэтому сначала нужно назначить себе ее с помощью LsaAddAccountRights или какого-нибудь инструмента(на что тоже нужны определенные права), а потом уже использовать AdjustTokenPrivileges.
P.S. Настоятельно не советую делать это в программе без ведома пользователя, как и вообще любое изменение настроек защиты.
← →
kaZaNoVa © (2005-01-25 18:09) [10]Набережных С. (25.01.05 18:02) [9]
> Настоятельно не советую делать это в программе без
> ведома пользователя
имхо почти все программы что-то делают без ведома пользователя, например пишут инфу в реестр и живут же)))))
← →
Набережных С. (2005-01-25 18:14) [11]>kaZaNoVa © (25.01.05 18:09) [10]
ИМХО, это НЕСОПОСТОВИМЫЕ вещи.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.039 c