Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
7-9318
DenKop
2001-11-26 21:20
2002.03.04
Рабочий стол.


1-9169
Zool
2002-02-12 17:34
2002.03.04
Как узнать в каком каталоге находится моя прога?


14-9291
@ndron
2002-01-16 00:17
2002.03.04
Delphi : Win API


1-9147
Poirot
2002-02-17 05:42
2002.03.04
Как сделать форму прозроачной - Alpha например на 70%


6-9246
Snake2000
2001-12-13 15:15
2002.03.04
ТВебБраузер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский