Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Вниз

Запуск приложения от имени другого юзера   Найти похожие ветки 

 
Arkara   (2003-05-13 14:19) [0]

Мастера, помогите! Ну не получаеться запустить процесс от имени другого юзера..вернее, залогиниться не получаеться...как сделать?

procedure TForm1.Button1Click(Sender: TObject);
var
Hmy: LongWord;
bFlag: boolean;
PMSI: TStartupInfo;
PMPI: TProcessInformation;
begin
bFlag:= LogonUser("myuser","","mypassw",LOGON32_LOGON_BATCH,LOGON32_PROVIDER_DEFAULT,Hmy);
FillChar(PMSI,Sizeof(PMSI),#0);
PMSI.wShowWindow := SW_NORMAL;
CreateProcessAsUser(Hmy,"explorer.exe",nil,nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,PMSI,PMPI);
end;
Помогите кто знает...Спасибо.


 
Valeris   (2003-05-13 18:38) [1]

Попробуй CreateProcessWithLogon


 
hope   (2003-05-14 03:33) [2]

Есть некоторые сложности с запуском процессов от имени пользователей в WinNT - это возможно только при наличии определённых привилегий, которые в свою очередь есть только у SYSTEM. Посему для решиния этой задачи я сделала сервисную службу, которая и запускала новый процесс. Всё это работает и под XP, но пришлось, довольно таки много кода написать для поддержки рабочего стола (а то не было видно окошек запущенного приложения). Весь код очень большой, потому только кусочек:

class function ProcessFuncs.StartInteractiveClientProcess(const User, Domain,
{"SocketServer.exe /port=" + IntToStr(P^.Port)}
Password, ProcessStr: string; out ProcessId, ThreadId: DWORD): BOOL;
var
Token: THandle;
SI: TStartupInfo;
PI: TProcessInformation;
// Desk: HDESK;
// WinSta, WinStaSave: HWINSTA;
Sid: pSid;
begin
Result := False;
ProcessId := 0;
ThreadId := 0;
Sid := nil;

if LogonUser(PChar(User), PChar(Domain), PChar(Password),
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, Token)
then
try
// Get the SID for the client"s logon session.
if GetLogonSID(Token, @Sid) then
try
// Impersonate client to ensure access to executable file.
if ImpersonateLoggedOnUser(Token) then
try
// Initialize the STARTUPINFO structure.
// Specify that the process runs in the interactive desktop.
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);
SI.lpDesktop := PChar("winsta0\default");
Result := CreateProcessAsUser(Token, nil, PChar(ProcessStr),
nil, nil, False, 0, nil, nil, SI, PI);
if Result then
begin
ProcessID := PI.dwProcessId;
ThreadID := PI.dwThreadId;
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
end
else
SysFuncs.SysError;
finally
RevertToSelf;
end;
finally
FreeLogonSID(@Sid);
end;
finally
CloseHandle(Token);
end
else
SysFuncs.SysError;
end;

В приведённом коде отсутствует поддержка desktop для WinXP.
весь код приведу, только по требованию. :о)


 
Spartak   (2003-05-14 07:12) [3]

есть такая штучка runas называеться ! пройдитесь по справке win2000, XP


 
Arkara   (2003-05-14 11:31) [4]

2 Valeris: вообще не нашел ничего такого (в смысле про CreateProcessWithLogon)....
2 Spartak: это понятно, но на мой взгляд все таки правильнее делать не через него...но все равно спасибо :)
2 hope: да в том-то и дело, что LogonUser возвращает false :((
ниччо не понимаю....:((


 
Arkara   (2003-05-14 11:43) [5]

2 Spartak: к тому же для использования RunAs нужно чтобы пользователь вводил пароль, а какой тогда мне в этом смысл...в том то и суть чтобы приложение запускалось из моего приложения под именем другого пользователя....


 
Arkara   (2003-05-14 17:24) [6]

Ну так что? Никто не может обьяснить почему не логиниться у меня юзер?

var
h: THandle;
begin
LogonUser(PChar("myuser"),"",PChar("mypassw"),LOGON32_LOGON_BATCH,LOGON32_PROVIDER_DEFAULT,H);
end;

LogonUser возвращает false, чего неправильно?


 
Игорь Шевченко   (2003-05-14 17:35) [7]

Вызов GetLastError пропущен умышленно или по незнанию ? А он обычно сообщает, почему функция вернула False...


 
Arkara   (2003-05-14 17:45) [8]

Пропущен по незнанию...:( Может обьясните, как им пользоваться?
Было бы просто здорово если бы кто нибудь привел работающий код, а то везде отрывками: там прочитаешь, что надо сервис создать сначала, там про привелегии, там еще чо-то...а в общую картинку как-то не вяжеться :(


 
BigDaddy   (2003-05-14 18:24) [9]

Добавляй в коде
if ..... неуспешное виполнение функции then
raise Exception.Create(SysErrorMessage(GetLastError));

Относительно работающего кода - проблема. Сам уже неделю ищу примери по использованию некоторих АРІ функций - безуспешно. В основном "переводи" с С++, причем очень мало корректно работающих....


 
ZZ   (2003-05-14 20:45) [10]

Никто не может обьяснить почему не логиниться у меня юзер?
На 99% не хватает прав... см MSDN


 
hope   (2003-05-15 01:36) [11]

Уважаемый, вы возможно не очень внимательно прочитали вступление к моему коду. Повторю ещё раз LogonUser будет работать только если вы имеете определённые привелегии, а они есть только у SYSTEM, поэтому Вам необходимо создать сервисную службу и из неё осуществлять запуск приложений


 
Arkara   (2003-05-15 10:25) [12]

2 BigDaddy : thanks :) насчет С++ - отож....
2 ZZ&hope: Уважаемые, понимаю что вы говорите правильные вещи, но не были бы вы так любезны показать как все это сделать? Огромная благодарность.


 
hope   (2003-05-16 04:23) [13]

Показать не могу, но если укажите e-mail, то перешлю пример, который работает в 2000/XP.
Пример создания сервисной службы можно посмотреть в исходниках Delphi - приложение SckSrvr.
Запуск процесса приведён - смотри выше. Если нужна поддержка ХП, то пришлите запрос на мыло fnv-hope@yandex.ru


 
Lord Warlock   (2003-05-16 13:42) [14]

Вот что у меня есть:

Ученик © (25.10.02 16:14)
Развитие ZZ © (25.10.02 16:07)

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;



Страницы: 1 вся ветка

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

Наверх





Память: 0.48 MB
Время: 0.01 c
1-77842
captive
2003-07-11 15:26
2003.07.24
Помогите с формами разобраться..


6-78035
SkyRanger
2003-05-17 08:07
2003.07.24
Сокеты Win32


1-77953
Дмитрий Стрижевич
2003-07-10 03:26
2003.07.24
копирование объектов...


3-77726
McSimm2
2003-06-30 10:00
2003.07.24
---|Ветка была без названия|---


11-77819
Serge Grivachenko
2002-11-09 00:46
2003.07.24
Менеджер памяти. (он же сборщик мусора или куча)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский