Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1106568764
SeregaMan
2005-01-24 15:12
2005.02.06
Как получить текст активной строки StringGrid


6-1101503646
GRF
2004-11-27 00:14
2005.02.06
закачка в отдельном потоке с возможностью отмены


3-1105367361
AlexTregubov
2005-01-10 17:29
2005.02.06
функции SQL


14-1105709784
*Pavel
2005-01-14 16:36
2005.02.06
Из "Искры" возгорелось пламя :(


9-1099279970
VolanD666
2004-11-01 06:32
2005.02.06
Описание *.mdl





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский