Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CreateProcessAsUser [D7, WinXP]


Jay1982 ©   (2005-01-25 16:11:00) 

Кто-нибудь знает как правильно оформить 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


Набережных С.   (2005-01-25 18:14:00) [1]

>kaZaNoVa ©   (25.01.05 18:09) [10]
ИМХО, это НЕСОПОСТОВИМЫЕ вещи.


kaZaNoVa   (2005-01-25 18:09:00) [2]

Набережных С.   (25.01.05 18:02) [9]

> Настоятельно не советую делать это в программе без
> ведома пользователя


имхо почти все программы что-то делают без ведома пользователя, например пишут инфу в реестр и живут же)))))


Набережных С.   (2005-01-25 18:02:00) [3]

Вообще-то в ХР она вроде не требуется...
Но раз уж ошибка есть, надо попробовать. По умалчанию, такой привилегией обладает только система, поэтому сначала нужно назначить себе ее с помощью LsaAddAccountRights или какого-нибудь инструмента(на что тоже нужны определенные права), а потом уже использовать AdjustTokenPrivileges.

P.S. Настоятельно не советую делать это в программе без ведома пользователя, как и вообще любое изменение настроек защиты.


Jay1982   (2005-01-25 17:48:00) [4]

Понятно, ещё раз спасибо


kaZaNoVa   (2005-01-25 17:35:00) [5]

kaZaNoVa ©   (25.01.05 17:34) [6]
этот код я обычно для SeDebugPrivilegeюзаю)) (она мне часто нужна))))))))))


kaZaNoVa   (2005-01-25 17:34:00) [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:33:00) [7]

Jay1982 ©   (25.01.05 16:11)

> GetLastError выдаёт ошибку 1314


советую юзать так:
MessageBox(0,Pchar( SysErrorMessage(GetLastError)),Pchar('Ошибка # '+IntToStr(GetLastError)),0);


Jay1982   (2005-01-25 17:28:00) [8]

А как её включить если не секрет?


Набережных С.   (2005-01-25 17:19:00) [9]

1314 - ERROR_PRIVILEGE_NOT_HELD
У маркера процесса нет или не включена привилегия SE_TCB_NAME.


Jay1982   (2005-01-25 16:34:00) [10]

Щас немного занят, обязательно проверю позже, большое спасибо.


kaZaNoVa   (2005-01-25 16:28:00) [11]

Игорь Шевченко как-то давал такой код, может поможет ..

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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо