я пошел Вот и сделал тестовую программу, чтобы увидеть, действительно ли она отключает диспетчер задач. В основном, включается простое bool, затем выключается, чтобы увидеть, действительно ли отключен диспетчер задач. Он работает как задумано, когда я скомпилировал и запустил его.
Изменить: код теперь выглядит так
#include <iostream>
#include <Windows.h>
using namespace std;
void LockTaskManager(bool Lock);
void main(void) {
LockTaskManager(true);
cout << "Testing task manager disable." << endl;
getchar();
LockTaskManager(false);
cout << "Testing task manager enabled." << endl;
getchar();
}
void LockTaskManager(bool Lock)
{
HKEY currKey;
DWORD dwDisposition;
DWORD dwType, dwSize;
DWORD value;
if (Lock)
value = 1;
else
value = 0;
LRESULT lResult = RegOpenCurrentUser(KEY_WRITE, &currKey);
if (RegCreateKeyEx(currKey,
TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\system"),
0,
NULL,
0,
KEY_SET_VALUE,
NULL,
&currKey,
&dwDisposition) == ERROR_SUCCESS)
{
dwType = REG_DWORD;
dwSize = sizeof(DWORD);
RegSetValueEx(currKey, TEXT("DisableTaskMgr"), 0, dwType, (PBYTE)&value, dwSize);
RegCloseKey(currKey);
}
}
Однако после того, как я переместил .exe гостевому пользователю на том же компьютере, он не отключает диспетчер задач. Итак, я пошел посмотреть, как и почему это работает, из MSDN от Microsoft Вот я обнаружил, что HKEY_CURRENT_USER не изменяется и требует использования RegOpenCurrentUser для установки текущего ключа для пользователя, который запускает эту программу. я знаю о этот пост, но ответ не является окончательным.
Итак, с учетом сказанного, я хочу знать, как правильно подойти к этому. Цель здесь — сделать так, чтобы тот, кто запускает .exe этого кода, не мог запускать диспетчер задач.
К вашему сведению, чтобы любой, кто читает это, знал, я намереваюсь использовать его в качестве защитного механизма в случае срабатывания флага, я хочу помешать вредоносным объектам убить этот процесс через диспетчер задач.
что такое HKEY_CURRENT_USER
? это действительно \REGISTRY\USER\<UserSid>
где <UserSid>
какой-то Сид. когда процесс первый раз использование HKEY_CURRENT_USER
(корень текущего ключа пользователя еще не открыт) системный запрос текущего пользователя sid ( TokenUser
), конвертировать sid в строку, добавить \REGISTRY\USER\
префикс, открытый и кэш открытый ключ когда процесс в следующий раз использовать, HKEY_CURRENT_USER
— использовал уже открытый и кешированный ключ. даже если нить олицетворяет — это ничего не меняет. Однако через некоторое время нам требуется доступ к другому пользовательскому ключу после олицетворения. именно для этой ситуации и RegOpenCurrentUser
и использовал. токен текущего потока (или процесса) этого API-запроса для TokenUser
, форматировать путь на основе ток пользователь sid, открыть \REGISTRY\USER\<UserSid1>
и верните ручку вам. он не кэширует этот дескриптор, вместо этого вы должны закрыть его, когда вам больше не нужен возвращаемый дескриптор.
так что сначала бессмысленное использование RegOpenCurrentUser
если вы не олицетворяете текущий поток.
во-вторых, этот код всегда бессмысленный:
LRESULT lResult = RegOpenCurrentUser(KEY_READ, &hkey);
if (RegCreateKeyEx(HKEY_CURRENT_USER,..
Вы не используете вернулся hKey
тем не мение. какой смысл открывать это в этом случае?
нужно использовать его на месте HKEY_CURRENT_USER
!
LRESULT lResult = RegOpenCurrentUser(KEY_READ, &hkey);
if (RegCreateKeyEx(hKey,..
почему код не работал под гостем? когда ты звонишь RegCreateKeyEx
и полученный ключ (system
в вашем случае) пока не существует — нужно иметь KEY_CREATE_SUB_KEY
доступ к родителю (Policies
ключ). однако по умолчанию у гостя нет прав на запись в ключ. у вас просто нет KEY_CREATE_SUB_KEY
доступ. а также KEY_SET_VALUE
у тебя тоже нет. уверен, что под гостевой звонок RegCreateKeyEx
вернуть ERROR_ACCESS_DENIED
тебе.
Других решений пока нет …