-
handle есть, но не удаётся изменить привилегии у другого процесса. Делаю через OpenProcessToken, потом AdjustTokenPrivileges. Для своего процесса всё хорошо, но для чужого - не идёт.
-
скорее всего прав не хватает, какая ошибка?
-
ошибки нет никакой вообще, GetLastError молчит. Проверяю выдачей прав на выключение системы (SeShutdownPrivilege). Мой процесс получает эти права и может выключить комп ( ExitWindowsEx(EWX_SHUTDOWN,0); ), но выдача этого же самого права другому процессу для такой же операции оканчивается ничем...
-
Это на установку привилегий: Function SetPrivilege(aPrivilegeName: String; aEnabled: Boolean; Hlink: THandle): Boolean;
Var TPPrev,
TP: TTokenPrivileges;
Token: THandle;
dwRetLen: DWord;
Begin
Result:=False;
OpenProcessToken(Hlink, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token );
TP.PrivilegeCount:=1;
IF (LookupPrivilegeValue(nil,PChar(aPrivilegeName),TP.Privileges[0].LUID )) then
Begin
IF aEnabled then TP.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED
else TP.Privileges[0].Attributes:=0;
dwRetLen:= 0;
Result:=AdjustTokenPrivileges(Token,False,TP,SizeOf(TPPrev),TPPrev,dwRetLen);
End;
CloseHandle(Token);
End; --------------------------------------- А вот вызов этой функции:
Hhandle := ShellExecute(0, nil, 'H:\NAME.exe', nil, nil, SW_HIDE); SetPrivilege('SeShutdownPrivilege', true, Hhandle );
-
> [3] Дмитрий (03.01.10 20:05)
(c) Help (ShellExecute): Return Value Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.
-
Т.е. ShellExecute не возвращает дескриптор процесса никаким боком??? Хм, а я думал почему значение всего двузначное показывало.=( (Сошлюсь на праздники =) ) ОК, тогда вопрос другого рода, как мне узнать дескриптор процесса зная путь к файлу?
-
> Boolean © (03.01.10 21:01) [5]
Перечислить процессы, их же несколько может быть. Проще запускать с помощью CreateProcess
-
Как несколько?=) У меня есть уникальный адрес, путь к файлу, совпадений быть не может. Как по этому пути, условно C:\Project.exe определить handle процесса?
-
> [7] Дмитрий (03.01.10 23:40) > Как несколько?=) У меня есть уникальный адрес, путь к файлу, совпадений быть не может
А что мешает стартовать "уникальному файлу" дважды ? Я бы воспользовалась советом: > [6] Дмитрий С © (03.01.10 23:36) > Проще запускать с помощью CreateProcess
-
Не надо разными никами в одной ветке писать, это не приветствуется.
Надо читать справку по примененным функциям (по всем), когда какие значения возвращаются и что они значат. У любых фукнции WinAPI, которые возвращают результат, надо проверять этот реультат, а не так, что OpenProcessToken и хрен бы с ним.
> Как по этому пути, условно C:\Project.exe определить handle > процесса?
Используй ShellExecuteEx, она возвращает Handle процесса (не забудь сказать в маске SEE_MASK_NOCLOSEPROCESS)
|