Рейтинг:
0
Jochen Arndt
Из MSDN[^]:
Цитата:
Функция AdjustTokenPrivileges не может добавить новые привилегии к маркеру доступа. Он может только включать или отключать существующие привилегии токена. Чтобы определить привилегии токена, вызовите функцию GetTokenInformation.
В качестве первого шага вы можете проверить привилегии, предложенные MSDN.
Код должен выполняться с достаточными правами доступа. Пользователям обычно разрешается выключать и перезапускать компьютер. Но вы пытаетесь сделать это удаленно, используя SNMP. Агент MS SNMP - это служба, которая, вероятно, не имеет права завершать работу системы (я точно не знаю, но имеет смысл, что служба не может завершать работу без какого-либо взаимодействия с пользователем).
EshwarTamil
Можно ли добавить привилегию завершения работы в службу SNMP вручную?
Jochen Arndt
У меня есть только базовые знания о таких вещах. Но вы можете добавить привилегию к учетной записи, которая запускает службу (обычно "система"), или создать новую учетную запись с этой привилегией и запустить службу, используя эту учетную запись. Я бы предпочел второй метод, потому что в противном случае все запущенные службы имели бы эту привилегию.
Вы также можете переосмыслить требование выключения. Я бы не позволил службе или какому-то удаленному доступу отключить мою систему.
Я не знаю, какие еще функции реализованы вашей библиотекой DLL. Если он предназначен только для выключения и перезапуска, вы можете реализовать его по-другому (например, обычное приложение автоматически запускается для всех пользователей, которое прослушивает сокет и предоставляет диалоговое окно с таймером, как показано, когда обновления Windows требуют перезагрузки).
EshwarTamil
Служба SNMP работает под учетной записью "локальная система".Его маркер включает в себя идентификаторы SID NT AUTHORITY\SYSTEM и BUILTIN\Administrators; эти учетные записи имеют доступ к большинству системных объектов. У него уже есть привилегия отключения.Тогда почему он выдает ошибку 1300??
Jochen Arndt
Пожалуйста, сначала проверьте эту привилегию с помощью функции GetTokenInformation(). В моей системе Windows 7 Pro только администраторы групп, пользователи и операторы резервного копирования могут завершить работу системы, и учетная запись Пользователя локальной системы (конечно же) не является членом этих групп.
bitbo
Я запускаю SNMP-агент на WIN10 (patch level 12/2017) и написал функцию для перечисления всех привилегий токенов с помощью GetTokenInformation() в моей библиотеке DLL расширения.
Я всегда получаю:
Информация: имея привилегию SeSecurityPrivilege 00000008 состояние:0x00000000)
Информация: имея привилегию SeDebugPrivilege 00000014 состояние:0x00000003)
Информация: имея привилегию SeChangeNotifyPrivilege 00000017 состояние:0x00000003)
В Windows 10 мы имеем "Windows Service Hardening" (WSH) активным.
Смотрите: http://www.itprotoday.com/management-mobility/understanding-windows-service-hardening
Я могу добавить привилегию SeLoadDriverPrivilege, используя:
sc privs snmp SeChangeNotifyPrivilege/SeSecurityPrivilege/SeDebugPrivilege/SeLoadDriverPrivilege
Я могу подтвердить это с помощью:
sc qprivs snmp 1024
как и в реестре
Компьютер в разделе\HKEY_LOCAL_MACHINE\система\CurrentControlSet на\услуги\протокол SNMP\элемент requiredprivileges
Но самое странное, что GetTokenInformation() в моей загруженной DLL-библиотеке расширения не показывает эту новую привилегию!?!?!
Мне кажется, что MS жестко закодировала привилегии в службе SNMP
(по крайней мере, при загрузке библиотек DLL расширений)
Есть идеи ?
Вот код для считывания текущих активных привилегий:
DWORD dwLen = 0;
TOKEN_PRIVILEGES tp = { 0 };
GetTokenInformation(hToken, TokenPrivileges, NULL, 0, &dwLen);
if(dwLen > 0)
{
BYTE* pBuffer = новый байт[dwLen];
if (pBuffer == NULL)
{
возвращать false;
}
if (GetTokenInformation(hToken, TokenPrivileges, pBuffer, dwLen, &retLength))
{
WriteAppLogFormat(L"INFO: GetTokenInformation returned Len=%d)", retLength);
TOKEN_PRIVILEGES* pPrivs = (TOKEN_PRIVILEGES*)pBuffer;
for (DWORD i = 0; i < pPrivs->PrivilegeCount; i++)
{
Имя WCHAR[100];
Размер DWORD = 100;
LookupPrivilegeName(значение null, &ампер;pPrivs-&ГТ;привилегии[я].Luid, имя, &ампер;размер);
WriteAppLogFormat(Д"информация: иметь привилегию %ы %08X состояние:значение 0x%08X)", имя, pPrivs-&ГТ;привилегии[я].Luid.LowPart, pPrivs->привилегии[i].Атрибуты);
pPrivs->привилегии[i].Атрибуты |= SE_PRIVILEGE_ENABLED;
}
}
еще
{
WriteAppLogFormat(L"ошибка: Ошибка GetTokenInformation 2. (0x%08X)", GetLastError());
}
}
еще
{
WriteAppLogFormat(L"ошибка: Ошибка GetTokenInformation 1. (0x%08X)", GetLastError());
}
...
Jochen Arndt
Извините, я не могу вам помочь в этом, потому что я до сих пор не использовал такое с Win 10 (а также не с WSH).