Форум: "WinAPI";
Текущий архив: 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
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c