EshwarTamil Ответов: 1

AdjustTokenPrivileges не удалось с ошибкой 1300


Привет,

Я разработал SNMP extension DLL для выполнения некоторых операций,таких как выключение,перезапуск и т. д. удаленно.Он прекрасно работает с XP.Теперь я переношу DLL для Windows 7.я прочитал документ "влияние изоляции сеанса-0" из MSDN и следовал инструкциям по миграции DLL.Например, я следовал инструкциям в ссылке http://msdn.microsoft.com/en-us/library/windows/desktop/aa376871(v=против 85).aspx и закодировал то же самое для операции выключения. Но "AdjustTokenPrivileges" всегда возвращаются Ошибка:1300 не все привилегии или группы, на которые ссылаются, назначены вызывающему абоненту.

Есть ли какой-нибудь способ решить эту ошибку??????

1 Ответов

Рейтинг:
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).