Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Вниз

МАСТЕРА, плз, помогите разобраться с CreateProcessWithLogonW! 


Hair_Fly   (2001-12-17 13:38) [0]

МАСТЕРА, плз, помогите разобраться с CreateProcessWithLogonW!
Я делаю следующее:

interface

function CreateProcessWithLogon
(
lpUsername, // user"s name
lpDomain, // user"s domain
lpPassword: PWideChar; // user"s password
dwLogonFlags: DWORD; // logon option
lpApplicationName: PWideChar; // executable module name
var lpCommandLine: PWideChar; // command-line string
dwCreationFlags: DWORD; // creation flags
lpEnvironment: Pointer; // new environment block
lpCurrentDirectory: PWideChar; // current directory name
const lpStartupInfo: TStartupInfo; // startup information
var lpProcessInformation: TProcessInformation //process inf
): Bool; stdcall;

implementation

function CreateProcessWithLogon; external advapi32 name "CreateProcessWithLogonW";


procedure TForm1.Button1Click(Sender: TObject);
var
UserName,UserDomain,Password,CommandLine:string;
begin
UserName:="Administrator";
UserDomain:=".";
Password:="";
CommandLine:="c:\Winnt\Notepad.exe";

if not
CreateProcessWithLogon(PWideChar(UserName),
PWideChar(UserDomain),PWideChar(Password),
LOGON32_LOGON_INTERACTIVE,nil,
PWideChar(CommandLine),
CREATE_NEW_CONSOLE or CREATE_NEW_PROCESS_GROUP,
nil,nil,StartUpInfo,ProcInfo) then
begin
ShowMessage(SysErrorMessage(GetLastError));
end;
end;


В итоге получаю: "The system cannot find the file specified".
Блокнот соответственно не запускается :( А очень надо.
Подскажите, пожалуйста, где ошибка. Очень нужно запустить прогу с правами администратора! ПЛИИИИЗЗЗЗЗЗ!!!!!



McSimm   (2001-12-17 14:46) [1]

Проблема в заполнении StartupInfo. Конкретнее не могу пока сказать.



Hair_Fly   (2001-12-17 15:35) [2]

Пока я эксперементировал, получил интересную вещь:

CreateProcessWithLogon(PWideChar(UserName),
PWideChar(UserDomain),PWideChar(Password),
LOGON32_LOGON_INTERACTIVE,nil,
"c:\Winnt\Notepad.exe", // ВМЕСТО PWideChar(CommandLine)
CREATE_NEW_CONSOLE or CREATE_NEW_PROCESS_GROUP,
nil,nil,StartUpInfo,ProcInfo)

Блокнот запускался, но виден был только в Task Manager.
Более того, если я вводил несуществующие UserName и Password, то блокнот ВСЕ РАВНО ЗАПУСКАЛСЯ!!! А при попытке его убить начинались всякие глюки (вплоть до зависания виндов)



Tosov   (2001-12-17 22:11) [3]

По моему PWideChar(String) использовать нельзя ??
надо:
var
pc:PChar;
pwc:PWideChar;

GetMem(pwc,512);
StringToWideChar(pc, pwc, 512);
....
freeMem(pwc);

насчет того, что блокнот не видно - надо смотреть StartupInfo.lpDesktop



Raptor   (2001-12-18 00:36) [4]

Привет!

2Tosov

По моему PWideChar(Stri! ng) использовать нельзя ??
надо:
var
pc:PChar;
pwc:PWideChar;

GetMem(pwc,512);
StringToWideChar(pc, pwc, 512);
....
freeMem(pwc);


Да, наверное нельзя, но можна сделать проще чем ты сделал.
Вот так.
var s:String;
ws:WideString;
pwc:PWideChar

ws:=WideString(s);
pwc:=POleStr(ws);

Raptor.



Tosov   (2002-01-02 23:16) [5]

Если еше надо кому-то Вероятно проблема в
var lpCommandLine: PWideChar;
Если этот var убрать, то все должно работать



Vovchik   (2002-01-03 00:44) [6]

Да, наверное var лишний. Эта ф-ция в SDK описана так:
BOOL CreateProcessWithLogonW(
LPCWSTR lpUsername, // user"s name
LPCWSTR lpDomain, // user"s domain
LPCWSTR lpPassword, // user"s password
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,
LPPROCESS_INFORMATION lpProcessInformation
);

А вообще, можно использовать две ф-ции LogonUser и CreateProcessAsUser. Тогда будет работать и под NT.

BOOL CreateProcessAsUser(
HANDLE hToken, // token representing the user
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command-line string
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles, // if process inherits handles
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation );

BOOL LogonUser( LPTSTR lpszUsername, // user name
LPTSTR lpszDomain, // domain or server
LPTSTR lpszPassword, // the password
DWORD dwLogonType, // type of logon operation
DWORD dwLogonProvider, // logon provider
PHANDLE phToken // receive tokens handle
);

Подробнее - в SDK.



Tosov   (2002-01-03 01:26) [7]

Vovchik
Все бы хорошо было с 2 функциями, но нужны права.. а их нет :)



Vovchik   (2002-01-03 19:18) [8]

Чё-то я не пойму? Права, по моему, нужны в любом случае. Функцию CreateProcessWithLogonW может выполнить только нить, работающая с правами SYSTEM. То же самое относится и к LogonUser и к CreateProcessAsUser. А если захочется ещё и локальный реестр грузить, то нужно будет ещё и LoadUserProfile. Я писал сервис (службу) когда такое было нужно.



Tosov   (2002-01-03 22:33) [9]

Как раз для CreateProcessWithLogonW права не нужны, а для LogonUser и CreateProcessAsUser надо.



Vovchik   (2002-01-03 23:05) [10]

Да? Ну, значит я отстал от жизни. Но вообще, какой-то отстой получается. Это вообще какая-то попсовая функция. Прога то запустится, ладно, но какой у неё будет при этом HKCU? И какие будут пеерменные окружения? Может, в данном случае это и не сильно важно, но в принципе может иметь значение для работоспособности запускаемой программы (не для блокнота, конечно).



Hair_Fly   (2002-01-04 10:02) [11]

Может кто-нибудь знает, как правильно заполнить StartupInfo ?



Vovchik   (2002-01-04 12:21) [12]

А что, в SDK нельзя посмотреть? Если надо, могу глянуть. Но чуть позже.



Hair_Fly   (2002-01-04 14:15) [13]

уточню вопрос: что нужно происать в STARTUPINFO.lpDesktop, чтобы юзер мог работать с запущенной прогой ?



McSimm   (2002-01-04 14:47) [14]

Не представляю, как это делать для сервиса - не пробовал. Для обычного приложения:

Возможно достаточно указать константу
"WinSta0\Default"

В общем случае надо получить это в виде
WinStaName + "\" + DeskTopName
где
WinStaName и DeskTopName получаем функцией
function GetUserObjectName(hUserObject: THandle): string;
var
Count: DWORD;
begin
// have the the API function determine the required string length
GetUserObjectInformation(hUserObject, UOI_NAME, PChar(Result), 0, Count);
SetLength(Result, Count + 1);

if GetUserObjectInformation(hUserObject, UOI_NAME, PChar(Result), Count, Count) then
StrResetLength(Result)
else
Result := "";
end;

Передавая в качестве параметров
GetProcessWindowStation
и
GetThreadDesktop(GetCurrentThreadId)
соответственно.
Если WinStaName или DeskTopName окажутся = "", подставляем константы "WinSta0" или "Default" соответственно



Hair_Fly   (2002-01-04 15:39) [15]

>McSimm
я так и делаю, но все равно таже фигня :(
т.е. блокнот запускается, но виден только в Task Manager, а если его убить, то сначала виснет Task Manager, а потом и винды



McSimm   (2002-01-04 15:47) [16]

Попробуй передать туда PWideChar.
Опиши переменную
var WChr: WideString;
Заполни ее и передай
STARTUPINFO.lpDesktop := PWideChar(WChr)



Vovchik   (2002-01-04 16:22) [17]

Могу сказать точно, что надо передавать строку "Winsta0\Default". Может быть (если ф-ция заканчивается на W) надо передавать вайд-строку. Но для сервиса необходимо поставить "разрешить доступ к рабочему столу". Есть такое свойство в дельфийском TServiceApplication.



Hair_Fly   (2002-01-04 16:46) [18]

Все. Заработало ! Всем спасибо за помощь.

P.S. Кстати, я тут нашел замечательную функцию
function StringToOleStr(const Source: string): PWideChar;
Это самый простой способ перевода из String в PWideChar ;)



McSimm   (2002-01-04 18:16) [19]

Функция, конечно, полезная, только как память после нее чистить?



Vovchik   (2002-01-04 20:38) [20]

Не знаю, может можно так:
var
s:string;
p:PWideChar;
begin
s:="sdfkuhwegivfusi




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.039 c
1-9118            ATLANTIDO             2002-02-16 01:33  2002.03.04  
KILL FORM


3-9058            Ivanov_Sergey         2002-02-06 12:53  2002.03.04  
Как использоватьudf в запросах к IB6


14-9268           veZuk                 2002-01-12 02:40  2002.03.04  
Сколько дать за перевод?


1-9181            Johnmen               2002-02-14 12:20  2002.03.04  
Кто плотно общался с DBGridEh ?


4-9334            - Andrew -            2002-01-03 17:46  2002.03.04  
Вопрос об идентификации однотипных дочерних окон в