Top.Mail.Ru
Ответы

Delphi - почему программа, запущенная из-под IDE, и не из-под IDE, имеют разные привилегии?

Есть дельфийская программка, которая тормозит некий процесс методом остановки всех его потоков.
Если запустить Дельфи от имени администратора, а из нее - эту программку, то все работает. Причем пофигу, в Debug mode запускать или нет.
Если просто запустить скомпилированную программку от имени администратора, она при попытке тормознуть поток получает по рукам с кодом 5 - access denied.
Собссно вопрос: что такое привносит дельфийский IDE, чего не хватает самой программе? И как это в нее можно добавить? На ум приходит только какая-то регистрация в качестве дебаггера или нечто в этом духе. Т. е. что запущенная неким "официальным" дебаггером программа имеет дополнительные привилегии.

Для желающих поиграться - код тормозящей процесс процедурки:

var
hThreadSnapshot: THandle;
threadEntry: TThreadEntry32;
hThread: THandle;
OpResult: DWORD;
begin
hThreadSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
try
threadEntry.dwSize := sizeof(TThreadEntry32);
Thread32First(hThreadSnapshot, threadEntry);
repeat
if threadEntry.th32OwnerProcessID=ProcessID then
begin
hThread := OpenThread(THREAD_ALL_ACCESS, FALSE, threadEntry.th32ThreadID);
if hThread = 0 then
RaiseLastError('Failed to gain access to thread '+IntToStr(threadEntry.th32ThreadID)+' of process '+IntToStr(ProcessID));
if _DoStop then
OpResult:=SuspendThread(hThread)
else
OpResult:=ResumeThread(hThread);
if OpResult<0 then
RaiseLastError('Failed to suspend or resume thread '+IntToStr(threadEntry.th32ThreadID)+' of process '+IntToStr(ProcessID));
CloseHandle(hThread);
end;
until not Thread32Next(hThreadSnapshot, threadEntry);
StoppedAs := skPauseThreads;
finally
CloseHandle(hThreadSnapshot);
end;
end;

По дате
По Рейтингу
Аватар пользователя
Новичок
5лет

Возможно дело в Debug привелегиях
AdjustTokenPriveleges и SE_DEBUG_NAME
https://docs.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-adjusttokenprivileges

Вероятно из Delphi процесс запускается с этими привелегиями по умолчанию, а из контекста юзера - нет.

Ну и да - для проверки можно получить текущие токены https://docs.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-gettokeninformation
Соотв. глянуть в одной ситуации и другой.

Это в теории. Delphi и винды под руками сейчас нет =\

Аватар пользователя
Ученик
5лет

.можете дать свой номер я не могу решить проблему с компом память не может быть read

Аватар пользователя
Оракул
5лет

Возможно IDE имеет цифровую подпись и система считает ее безопасной.

Аватар пользователя
Искусственный Интеллект
5лет

Да потому что программа запускается самой IDE, и соответственно наделяется теми же правами администратора.