Как запустить программу от имени пользователя
От: Maxus  
Дата: 26.07.02 09:42
Оценка:
CreateProcessWithLogonW работает (гружу из библиотеки advapi32.dll), но почему-то работает с любым именем пользователя и паролем. Все процессы создает от моего имени (пользователя в данный момент залогинившегося в систему). Почему? Кто знает?
Что-то я не так делаю?

Подскажите, плз.
Re: Как запустить программу от имени пользователя
От: Алекс Россия http://wise-orm.com
Дата: 26.07.02 10:32
Оценка:
Здравствуйте Maxus, Вы писали:

M>CreateProcessWithLogonW работает (гружу из библиотеки advapi32.dll), но почему-то работает с любым именем пользователя и паролем. Все процессы создает от моего имени (пользователя в данный момент залогинившегося в систему). Почему? Кто знает?

M>Что-то я не так делаю?

M>Подскажите, плз.


Что значит
работает с любым именем пользователя и паролем
Непонятно! Приведи код.
Re[2]: Как запустить программу от имени пользователя
От: Maxus  
Дата: 26.07.02 10:46
Оценка:
Здравствуйте Алекс, Вы писали:

А>Что значит

А>работает с любым именем пользователя и паролем
А>Непонятно! Приведи код.

{skiped}
type
FCreateProc = function (
lpUsername: PChar; // user's name
lpDomain: PChar; // user's domain
lpPassword: PChar; // user's password
dwLogonFlags: DWORD; // logon option
lpApplicationName: PWideChar; // executable module name
lpCommandLine: PWideChar; // command-line string
dwCreationFlags: DWORD; // creation flags
lpEnvironment: Pointer; // new environment block
lpCurrentDirectory: PChar; // current directory name
const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation) : Boolean; stdcall;

procedure TForm1.Button1Click(Sender: TObject);
var
si: TStartUpInfo;
pi: TProcessInformation;
ShowWnd: WORD;
Succ: Boolean;
dwIndex: DWORD;
i: Integer;
begin

{skiped}


dl:=LoadLibrary('advapi32.dll');
@CreateProc:=GetProcAddress(dl,'CreateProcessWithLogonW');
res:=CreateProc(
'User', // user's name
nil, // user's domain
'xxxx', // user's password
$00000002, // logon option
'C:\logon.exe', // executable module name
'C:\logon.exe', // command-line string
CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS, // creation flags
nil, // new environment block
nil, // current directory name
si, // startup information
pi // process information
);
E:=GetLastError;

end;

Ввожу люое имя пользователя и пароль — запускается от моего имени.
Re[3]: Как запустить программу от имени пользователя
От: vasketsov Россия http://ntprog.by.ru
Дата: 26.07.02 11:07
Оценка:
Здравствуйте Maxus, Вы писали:

M>Здравствуйте Алекс, Вы писали:


А>>Что значит

А>>работает с любым именем пользователя и паролем
А>>Непонятно! Приведи код.

M>{skiped}

M>type
M> FCreateProc = function (
M> lpUsername: PChar; // user's name
M> lpDomain: PChar; // user's domain
M> lpPassword: PChar; // user's password
M> dwLogonFlags: DWORD; // logon option
M> lpApplicationName: PWideChar; // executable module name
M> lpCommandLine: PWideChar; // command-line string
M> dwCreationFlags: DWORD; // creation flags
M> lpEnvironment: Pointer; // new environment block
M> lpCurrentDirectory: PChar; // current directory name
M> const lpStartupInfo: TStartupInfo;
M> var lpProcessInformation: TProcessInformation) : Boolean; stdcall;

По-моему функция неправильно описана.

BOOL CreateProcessWithLogonW(
LPCWSTR lpUsername, // user's name
LPCWSTR lpDomain, // user's domain
LPCWSTR lpPassword, // user's password
DWORD dwLogonFlags, // logon option
LPCWSTR lpApplicationName, // executable module name
LPWSTR lpCommandLine, // command-line string
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCWSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFOW lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInfo // process information
);

на паскаль переводится так:

type
FCreateProc = function (
lpUsername: PWideChar; // user's name
lpDomain: PWideChar; // user's domain
lpPassword: PWideChar; // user's password
dwLogonFlags: DWORD; // logon option
lpApplicationName: PWideChar; // executable module name
lpCommandLine: PWideChar; // command-line string
dwCreationFlags: DWORD; // creation flags
lpEnvironment: Pointer; // new environment block
lpCurrentDirectory: PWideChar; // current directory name
lpStartupInfo: PStartupInfoW;
lpProcessInformation: PProcessInformation) : int; stdcall;


lpCommandLine: LPWSTR — а у тебя константа, нельзя так делать.
Васкецов Сергей
http://registry.km.ru
Re[4]: Как запустить программу от имени пользователя
От: Maxus  
Дата: 26.07.02 11:20
Оценка:
Здравствуйте vasketsov, Вы писали:


V>По-моему функция неправильно описана.


V>на паскаль переводится так:


V>type

V> FCreateProc = function (
V> lpUsername: PWideChar; // user's name
V> lpDomain: PWideChar; // user's domain
V> lpPassword: PWideChar; // user's password
V> dwLogonFlags: DWORD; // logon option
V> lpApplicationName: PWideChar; // executable module name
V> lpCommandLine: PWideChar; // command-line string
V> dwCreationFlags: DWORD; // creation flags
V> lpEnvironment: Pointer; // new environment block
V> lpCurrentDirectory: PWideChar; // current directory name
V> lpStartupInfo: PStartupInfoW;
V> lpProcessInformation: PProcessInformation) : int; stdcall;


V>lpCommandLine: LPWSTR — а у тебя константа, нельзя так делать.


Дык у меня константа и lpCommandLine и lpApplicationName, а они обе у меня описаны как PWideChar. Однако запускается же приложение. Вот только все время от моего имени (того кто сейчас находится в системе), а надо от другого.
Re[5]: Как запустить программу от имени пользователя
От: vasketsov Россия http://ntprog.by.ru
Дата: 26.07.02 11:22
Оценка:
Здравствуйте Maxus, Вы писали:

M>Здравствуйте vasketsov, Вы писали:



V>>По-моему функция неправильно описана.


V>>на паскаль переводится так:


V>>type

V>> FCreateProc = function (
V>> lpUsername: PWideChar; // user's name
V>> lpDomain: PWideChar; // user's domain
V>> lpPassword: PWideChar; // user's password
V>> dwLogonFlags: DWORD; // logon option
V>> lpApplicationName: PWideChar; // executable module name
V>> lpCommandLine: PWideChar; // command-line string
V>> dwCreationFlags: DWORD; // creation flags
V>> lpEnvironment: Pointer; // new environment block
V>> lpCurrentDirectory: PWideChar; // current directory name
V>> lpStartupInfo: PStartupInfoW;
V>> lpProcessInformation: PProcessInformation) : int; stdcall;


V>>lpCommandLine: LPWSTR — а у тебя константа, нельзя так делать.


M>Дык у меня константа и lpCommandLine и lpApplicationName, а они обе у меня описаны как PWideChar. Однако запускается же приложение. Вот только все время от моего имени (того кто сейчас находится в системе), а надо от другого.


Это не я придумал, откройте MSDN и посмотрите, хотя бы msdn.microsoft.com
Там это английским по белому написано.
И первые параметры, в частности, юзер — не PCHAR.
Васкецов Сергей
http://registry.km.ru
Re[6]: Как запустить программу от имени пользователя
От: Maxus  
Дата: 26.07.02 11:27
Оценка:
Здравствуйте vasketsov, Вы писали:

V>Это не я придумал, откройте MSDN и посмотрите, хотя бы msdn.microsoft.com

V>Там это английским по белому написано.
V>И первые параметры, в частности, юзер — не PCHAR.

Да я признателен за советы. Сейчас попробовал вот так:

type
FCreateProc = function (
lpUsername: PWideChar; // user's name
lpDomain: PWideChar; // user's domain
lpPassword: PWideChar; // user's password
dwLogonFlags: DWORD; // logon option
lpApplicationName: PWideChar; // executable module name
lpCommandLine: PWideChar; // command-line string
dwCreationFlags: DWORD; // creation flags
lpEnvironment: Pointer; // new environment block
lpCurrentDirectory: PWideChar; // current directory name
const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation) : Boolean; stdcall;


{skiped}

var
UserName,Paswd: PWideChar;

{skiped}

procedure TForm1.Button1Click(Sender: TObject);
var
si: TStartUpInfo;
pi: TProcessInformation;
ShowWnd: WORD;
Succ: Boolean;
dwIndex: DWORD;
i: Integer;
begin

{skiped}

UserName:='User';
Paswd:='xxxx';
dl:=LoadLibrary('advapi32.dll');
@CreateProc:=GetProcAddress(dl,'CreateProcessWithLogonW');
res:=CreateProc(
UserName, // user's name
nil, // user's domain
Paswd, // user's password
$00000002, // logon option
'C:\logon.exe', // executable module name
'C:\logon.exe', // command-line string
CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS, // creation flags
nil, // new environment block
nil, // current directory name
si, // startup information
pi // process information
);
E:=GetLastError;

end;

Все равно не помогает.
Re[7]: Как запустить программу от имени пользователя
От: vasketsov Россия http://ntprog.by.ru
Дата: 26.07.02 11:37
Оценка:
Здравствуйте Maxus, Вы писали:

M> 'C:\logon.exe', // executable module name

M> 'C:\logon.exe', // command-line string

Вы как, вообще понимаете что вам пишут?
CommandLine либо NULL либо НЕ константа, а переменная.
Для тех, кто в танке.

lpCommandLine
[in] Pointer to a null-terminated string that specifies the command line to execute.
This function will fail if this parameter is a const string.

The lpCommandLine parameter can be NULL. In that case, the function uses the string pointed to by lpApplicationName as the command line.
Васкецов Сергей
http://registry.km.ru
Re[8]: Как запустить программу от имени пользователя
От: Maxus  
Дата: 26.07.02 11:41
Оценка: -1
Здравствуйте vasketsov, Вы писали:

V>Вы как, вообще понимаете что вам пишут?

V>CommandLine либо NULL либо НЕ константа, а переменная.
V>Для тех, кто в танке.

V>lpCommandLine

V>[in] Pointer to a null-terminated string that specifies the command line to execute.
V>This function will fail if this parameter is a const string.

V>The lpCommandLine parameter can be NULL. In that case, the function uses the string pointed to by lpApplicationName as the command line.



Я нормально понимаюто, что мне пишут. Все это уже попробовано. То, что я это здесь не привел прошу не считать пробелом в знаниях и неумением читать хелп.
Re[9]: Как запустить программу от имени пользователя
От: vasketsov Россия http://ntprog.by.ru
Дата: 26.07.02 11:49
Оценка: 18 (1)
Здравствуйте Maxus, Вы писали:

M>Здравствуйте vasketsov, Вы писали:


V>>Вы как, вообще понимаете что вам пишут?

V>>CommandLine либо NULL либо НЕ константа, а переменная.
V>>Для тех, кто в танке.

V>>lpCommandLine

V>>[in] Pointer to a null-terminated string that specifies the command line to execute.
V>>This function will fail if this parameter is a const string.

V>>The lpCommandLine parameter can be NULL. In that case, the function uses the string pointed to by lpApplicationName as the command line.



M>Я нормально понимаюто, что мне пишут. Все это уже попробовано. То, что я это здесь не привел прошу не считать пробелом в знаниях и неумением читать хелп.


Все, я пас.
Написали правильно формат функции — "не заметил" последние параметры как были бредовые, так и остались, вообще, различаете структуру и указатель на нее?
сказано не писать константу — пишешь.

вот специально проверил — все работает нормально, если писать нормально.
Васкецов Сергей
http://registry.km.ru
Re[10]: Как запустить программу от имени пользователя
От: Maxus  
Дата: 26.07.02 11:52
Оценка:
Здравствуйте vasketsov, Вы писали:

V>Все, я пас.

V>Написали правильно формат функции — "не заметил" :???: последние параметры как были бредовые, так и остались, вообще, различаете структуру и указатель на нее?
V>сказано не писать константу — пишешь.
V> :crash: :crash: :crash:
V>вот специально проверил — все работает нормально, если писать нормально.


Блин! Да писал я "нормально". Просто уже после того как отправил то сообщение!!!!!!!!
Может поделитесь тогда куском кода (вызова функции)?
Re[10]: Как запустить программу от имени пользователя
От: Maxus  
Дата: 26.07.02 12:03
Оценка: -1
Здравствуйте vasketsov, Вы писали:


V>Все, я пас.

V>Написали правильно формат функции — "не заметил" :???: последние параметры как были бредовые, так и остались, вообще, различаете структуру и указатель на нее?


Если Вы имеете в виду последние параметры, то это только в в С++ на ставить &. В Дельфи, для танкистов ;-), не надо получать указатель на структуру — это делается автоматически! Если я поставлю & перед последними параметрами мне выдастся сообщение что праметры formal и actuаl не совпадают.
Re[11]: Как запустить программу от имени пользователя
От: vasketsov Россия http://ntprog.by.ru
Дата: 26.07.02 12:06
Оценка:
Здравствуйте Maxus, Вы писали:

M>Здравствуйте vasketsov, Вы писали:



V>>Все, я пас.

V>>Написали правильно формат функции — "не заметил" последние параметры как были бредовые, так и остались, вообще, различаете структуру и указатель на нее?


M>Если Вы имеете в виду последние параметры, то это только в в С++ на ставить &. В Дельфи, для танкистов , не надо получать указатель на структуру — это делается автоматически! Если я поставлю & перед последними параметрами мне выдастся сообщение что праметры formal и actuаl не совпадают.


Пусть есть функция, которая принимает на вход LARGE_INTEGER (это 8 байт)
И есть другая, которая хочет указатель PLARGE_INTEGER (это 4 байта).
И те и другие есть, и немало.
Как тогда отличить их вызов?
Васкецов Сергей
http://registry.km.ru
Re[12]: Как запустить программу от имени пользователя
От: Maxus  
Дата: 26.07.02 12:10
Оценка:
Здравствуйте vasketsov, Вы писали:


V>Пусть есть функция, которая принимает на вход LARGE_INTEGER (это 8 байт)

V>И есть другая, которая хочет указатель PLARGE_INTEGER (это 4 байта).
V>И те и другие есть, и немало.
V>Как тогда отличить их вызов?

OK!! Special for you!

l:=LoadLibrary('advapi32.dll');
@CreateProc:=GetProcAddress(dl,'CreateProcessWithLogonW');
res:=CreateProc(
UserName, // user's name
nil, // user's domain
Paswd, // user's password
$00000002, // logon option
FileName, // executable module name
CmdLine, // command-line string
CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS, // creation flags
nil, // new environment block
nil, // current directory name
@si, // startup information
@pi // process information
);
E:=GetLastError;

Пишет:
Incompatible types _STARTUPINFOA and Pointer
Types of actual and formal parameters must be identical.

Что и требовалось доказать.

Дельфи автоматически в функцию передвет указатель. Здесь не надо подходяить с точки зрения С++.
Re[13]: Как запустить программу от имени пользователя
От: vasketsov Россия http://ntprog.by.ru
Дата: 26.07.02 12:14
Оценка:
Здравствуйте Maxus, Вы писали:

M>Incompatible types _STARTUPINFOA and Pointer


Что здесь делает STARTUPINFOA ???
Васкецов Сергей
http://registry.km.ru
Re[14]: Как запустить программу от имени пользователя
От: Maxus  
Дата: 26.07.02 12:19
Оценка:
Здравствуйте vasketsov, Вы писали:

M>>Incompatible types _STARTUPINFOA and Pointer


V>Что здесь делает STARTUPINFOA ???


То есть как это что?! Мы с Вами говорим про последние параметры?

si, // startup information
pi // process information

Так они у меня определены.

si: TStartUpInfo;
pi: TProcessInformation;

А уж в Windows.pas это указатели на структуру. Потому и не надо ставить & перед нимим когда передаем их в функцию.

//windows.pas

PStartupInfo = ^TStartupInfo;
TStartupInfo = record
cb: Longint;
lpReserved: Pointer;
lpDesktop: Pointer;
lpTitle: Pointer;
dwX: Longint;
dwY: Longint;
dwXSize: Longint;
dwYSize: Longint;
dwXCountChars: Longint;
dwYCountChars: Longint;
dwFillAttribute: Longint;
dwFlags: Longint;
wShowWindow: Word;
cbReserved2: Word;
lpReserved2: ^Byte;
hStdInput: Integer;
hStdOutput: Integer;
hStdError: Integer;
end;
Re[14]: Как запустить программу от имени пользователя
От: Maxus  
Дата: 26.07.02 12:22
Оценка:
Здравствуйте vasketsov, Вы писали:

M>>Incompatible types _STARTUPINFOA and Pointer


V>Что здесь делает STARTUPINFOA ???


Да собсно не о том речь. Было бы что-то не то в параметрах — функция бы выдавала False и код ошибки, то ведь выдает True и 0. Процесс-то запускается!
Re[15]: Как запустить программу от имени пользователя
От: vasketsov Россия http://ntprog.by.ru
Дата: 26.07.02 12:23
Оценка:
Здравствуйте Maxus, Вы писали:

M>si: TStartUpInfo;


M>PStartupInfo = ^TStartupInfo;

M> TStartupInfo = record
M> cb: Longint;
M> lpReserved: Pointer;
M> lpDesktop: Pointer;
M> lpTitle: Pointer;
M> dwX: Longint;
M> dwY: Longint;
M> dwXSize: Longint;
M> dwYSize: Longint;
M> dwXCountChars: Longint;
M> dwYCountChars: Longint;
M> dwFillAttribute: Longint;
M> dwFlags: Longint;
M> wShowWindow: Word;
M> cbReserved2: Word;
M> lpReserved2: ^Byte;
M> hStdInput: Integer;
M> hStdOutput: Integer;
M> hStdError: Integer;
M> end;


И здесь si — это указатель на структуру?
Указатель будет PStartupInfo, в ПРАВИЛЬНО описанную функцию (а не как у вас) надо передавать @si
Васкецов Сергей
http://registry.km.ru
Re[16]: Как запустить программу от имени пользователя
От: Maxus  
Дата: 26.07.02 12:25
Оценка:
Здравствуйте vasketsov, Вы писали:

V>Здравствуйте Maxus, Вы писали:



V>И здесь si — это указатель на структуру? :no: :no: :no:

V>Указатель будет PStartupInfo, в ПРАВИЛЬНО описанную функцию (а не как у вас) надо передавать @si

Я же Вам писал, что получается когда так пишем.


Incompatible types _STARTUPINFOA and Pointer
Types of actual and formal parameters must be identical.


Это Дельфи. Она сама это все делает. Здесь переменная, когда ее передаешь в функцию — это указаетель на нее.
Re[16]: Как запустить программу от имени пользователя
От: Maxus  
Дата: 26.07.02 12:26
Оценка:
Здравствуйте vasketsov, Вы писали:


V>И здесь si — это указатель на структуру? :no: :no: :no:

V>Указатель будет PStartupInfo, в ПРАВИЛЬНО описанную функцию (а не как у вас) надо передавать @si

windows.pas

{$EXTERNALSYM _STARTUPINFOA}
TStartupInfo = _STARTUPINFOA;
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.