Форум: "WinAPI";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];
ВнизПомогите с CreateProcessWithLogonW... Найти похожие ветки
← →
Deathless (2002-11-15 11:12) [0]Помогите кто-нибудь: у меня программа вылетает с сообщением Access Violation и очень подозрительно при этом ругается на ntdll.dll при использовании функции CreateProcessWithLogonW
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
function CreateProcessWithLogonW(lpUserName,
lpDomain,
lpPassword: PWideChar;
dwLogonFlags: dword;
lpApplicationName,
lpCommandLine: PWideChar;
dwCreationFlags: dword;
lpEnvironment: Pointer;
lpCurrentDirectory: PWideChar;
lpStartupInfo: tstartupinfo;
lpProcessInfo: TProcessInformation): bool; external("advapi32.dll");
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var ProcInfo:TProcessInformation;
StartInfo:TStartUpInfo;
user: WideString;
password: WideString;
cmd: WideString;
path: WideString;
begin
FillChar(StartInfo,SizeOf(StartInfo),0);
with StartInfo do begin
cb := SizeOf(StartInfo);
dwFlags := startf_UseShowWindow;
wShowWindow := 4;
end;
user := "login";
password := "пароль";
cmd := "command.com";
path := "c:\";
createprocessWithLogonW
(PWideChar(user), // pointer to thread security attributes
nil,
PWideChar(password),
1,
nil, // pointer to name of executable module
PWideChar(cmd), // pointer to command line string
NORMAL_PRIORITY_CLASS or
CREATE_NEW_CONSOLE, // creation flags
nil, // pointer to new environment block
PWideChar(path), // pointer to current directory name
StartInfo, // pointer to STARTUPINFO
ProcInfo); // pointer to PROCESS_INFORMATION;
end;
end.
Буду очень рад получить какие-либо советы или хотя бы работающий код. Заранее благодарен.
← →
ZZ (2002-11-15 16:05) [1]// pointer to STARTUPINFO
// pointer to PROCESS_INFORMATION
Кто тебе сказал, что это pointer"ы ???
lpStartupInfo: tstartupinfo;
lpProcessInfo: TProcessInformation):
Где ТУТ про это У ТЕБЯ написано??
← →
ZZ (2002-11-15 16:10) [2]На всякий случай скажу понятнее - в описании у тебя 2 последних параметра должны быть указателями, но таковыми не являются - это раз.
tstartupinfo на самом деле должен быть TStartupInfo W (это не важно в данном случае... просто прийми к сведению когда захочешь заполнить поле PChar"ом)
← →
Deathless (2002-11-16 10:25) [3]Не совсем понял... мне что - надо описывать следующим образом:
lpStartupInfo: Pointer;
lpProcessInfo: Pointer
...извиняюсь за необразованность, но никогда раньше не занимался подобными вещами.
← →
Deathless (2002-11-16 10:37) [4]...я сделал вот так:
...
function CreateProcessWithLogonW(lpUserName,
lpDomain,
lpPassword: PWideChar;
dwLogonFlags: dword;
lpApplicationName,
lpCommandLine: PWideChar;
dwCreationFlags: dword;
lpEnvironment: Pointer;
lpCurrentDirectory: PWideChar;
lpStartupInfo: Pointer;
lpProcessInfo: Pointer): bool; external("advapi32.dll");
...
FillChar(si^,SizeOf(si^),0);
with si^ do begin
cb := SizeOf(si^);
dwFlags := startf_UseShowWindow;
wShowWindow := 4;
end;
...
createprocessWithLogonW
(PWideChar(user), // pointer to thread security attributes
nil,
PWideChar(password),
1,
nil, // pointer to name of executable module
PWideChar(cmd), // pointer to command line string
NORMAL_PRIORITY_CLASS or
CREATE_NEW_CONSOLE, // creation flags
nil, // pointer to new environment block
PWideChar(path), // pointer to current directory name
si, // pointer to STARTUPINFO
pi); // pointer to PROCESS_INFORMATION;
Но тоже не работает и вылетает с такой же ошибкой(((
← →
Ученик (2002-11-16 12:32) [5]function CreateProcessWithLogonW(
lpUsername : PWChar;
lpDomain : PWChar;
lpPassword : PWChar;
dwLogonFlags : DWord;
lpApplicationName : PWChar;
lpCommandLine : PWChar;
dwCreationFlags : DWord;
lpEnvironment : Pointer;
lpCurrentDirectory : PWChar;
var lpStartupInfo : TStartupInfo;
var lpProcessInfo : TProcessInformation
) : Bool; stdcall; external "AdvApi32.dll";
procedure TForm1.Button5Click(Sender: TObject);
var
StartupInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
begin
FillChar(StartupInfo, SizeOf(StartupInfo), 0);
StartupInfo.cb := SizeOf(StartupInfo);
if CreateProcessWithLogonW("UserName", "DomainName", "Password",
0, "notepad.exe", "", CREATE_DEFAULT_ERROR_MODE, nil, nil,
StartupInfo, ProcessInfo) then begin
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread)
end else
Win32Check(False)
end;
← →
ZZ (2002-11-16 12:32) [6]примерно так (из 1 варианта)
const lpStartupInfo: tstartupinfo;
var lpProcessInfo: TProcessInformation): bool; external "advapi32.dll";
← →
Deathless (2002-11-17 07:58) [7]...огромное всем спасибо, после последних двух замечаний все отлично заработало... теперь осталось подчистить небольшие косячки...
Например почему строка "notepad.exe" запускается без проблем, а "wmplayer.exe" - нет (только при прописке полного пути), хотя при запуске обоих строк через run (который в Пуске) все проходит нормально.... может все дело в наличии двух пунктов -
lpApplicationName : PWChar;
lpCommandLine : PWChar;
Когда каим надо пользоваться?
З.Ы. Еще раз всем СПАСИБО
← →
Deathless (2002-11-18 06:50) [8]Вроде как все заработало... Очень интересным параметром оказался dwLogonFlags - при установке его значения в 2 отпала необходимость в наличии у пользователя прав на локальный вход на рабочую станцию...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c