CreateProcessWithLogonW работает (гружу из библиотеки advapi32.dll), но почему-то работает с любым именем пользователя и паролем. Все процессы создает от моего имени (пользователя в данный момент залогинившегося в систему). Почему? Кто знает?
Что-то я не так делаю?
Здравствуйте Maxus, Вы писали:
M>CreateProcessWithLogonW работает (гружу из библиотеки advapi32.dll), но почему-то работает с любым именем пользователя и паролем. Все процессы создает от моего имени (пользователя в данный момент залогинившегося в систему). Почему? Кто знает? M>Что-то я не так делаю?
M>Подскажите, плз.
Что значит работает с любым именем пользователя и паролем
Непонятно! Приведи код.
Re[2]: Как запустить программу от имени пользователя
V>lpCommandLine: LPWSTR — а у тебя константа, нельзя так делать.
Дык у меня константа и lpCommandLine и lpApplicationName, а они обе у меня описаны как PWideChar. Однако запускается же приложение. Вот только все время от моего имени (того кто сейчас находится в системе), а надо от другого.
Re[5]: Как запустить программу от имени пользователя
V>>lpCommandLine: LPWSTR — а у тебя константа, нельзя так делать.
M>Дык у меня константа и lpCommandLine и lpApplicationName, а они обе у меня описаны как PWideChar. Однако запускается же приложение. Вот только все время от моего имени (того кто сейчас находится в системе), а надо от другого.
Это не я придумал, откройте MSDN и посмотрите, хотя бы msdn.microsoft.com
Там это английским по белому написано.
И первые параметры, в частности, юзер — не PCHAR.
Здравствуйте 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]: Как запустить программу от имени пользователя
Здравствуйте 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.
Здравствуйте 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]: Как запустить программу от имени пользователя
Здравствуйте 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>Я нормально понимаюто, что мне пишут. Все это уже попробовано. То, что я это здесь не привел прошу не считать пробелом в знаниях и неумением читать хелп.
Все, я пас.
Написали правильно формат функции — "не заметил" последние параметры как были бредовые, так и остались, вообще, различаете структуру и указатель на нее?
сказано не писать константу — пишешь.
вот специально проверил — все работает нормально, если писать нормально.
Здравствуйте vasketsov, Вы писали:
V>Все, я пас. V>Написали правильно формат функции — "не заметил" :???: последние параметры как были бредовые, так и остались, вообще, различаете структуру и указатель на нее? V>сказано не писать константу — пишешь. V> :crash: :crash: :crash: V>вот специально проверил — все работает нормально, если писать нормально.
Блин! Да писал я "нормально". Просто уже после того как отправил то сообщение!!!!!!!!
Может поделитесь тогда куском кода (вызова функции)?
Re[10]: Как запустить программу от имени пользователя
V>Все, я пас. V>Написали правильно формат функции — "не заметил" :???: последние параметры как были бредовые, так и остались, вообще, различаете структуру и указатель на нее?
Если Вы имеете в виду последние параметры, то это только в в С++ на ставить &. В Дельфи, для танкистов ;-), не надо получать указатель на структуру — это делается автоматически! Если я поставлю & перед последними параметрами мне выдастся сообщение что праметры formal и actuаl не совпадают.
Re[11]: Как запустить программу от имени пользователя
Здравствуйте Maxus, Вы писали:
M>Здравствуйте vasketsov, Вы писали:
V>>Все, я пас. V>>Написали правильно формат функции — "не заметил" последние параметры как были бредовые, так и остались, вообще, различаете структуру и указатель на нее?
M>Если Вы имеете в виду последние параметры, то это только в в С++ на ставить &. В Дельфи, для танкистов , не надо получать указатель на структуру — это делается автоматически! Если я поставлю & перед последними параметрами мне выдастся сообщение что праметры formal и actuаl не совпадают.
Пусть есть функция, которая принимает на вход LARGE_INTEGER (это 8 байт)
И есть другая, которая хочет указатель PLARGE_INTEGER (это 4 байта).
И те и другие есть, и немало.
Как тогда отличить их вызов?
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, Вы писали:
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]: Как запустить программу от имени пользователя
V>И здесь si — это указатель на структуру? :no: :no: :no: V>Указатель будет PStartupInfo, в ПРАВИЛЬНО описанную функцию (а не как у вас) надо передавать @si