Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.24;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
1-77962
Appa
2003-07-11 08:04
2003.07.24
TMonthCalendar


6-78015
Demn
2003-05-16 14:19
2003.07.24
Время рабочей станции


3-77725
boka
2003-06-27 09:24
2003.07.24
Как из txt перебросить данные в dbf


14-78045
Dmitriy O.
2003-07-08 15:57
2003.07.24
Куда лучше прописывать настройки.


14-78135
Tornado
2003-07-09 10:23
2003.07.24
DELPHI 7