Форум: "Система";
Текущий архив: 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.008 c