безопасность — правильно реализовать WlanSetSecuritySettings для WlanHostedNetwork-функций

Как видно из названия, я не совсем уверен, как правильно реализовать WlanSetSecuritySettings функция, чтобы получить полный доступ из системы для редактирования WlanHostedNetwork от родного wlanapi (-> Как я получаю сообщение об ошибке на некоторых системах, которое говорит о том, что у меня нет доступа и что мне требуется повышение прав!).
В документе MSDN есть следующее руководство, как это сделать — я старался следовать ему, насколько это возможно:

Функция WlanHostedNetworkForceStart может завершиться ошибкой, если размещена в сети
состояние wlan_hosted_network_unavailable или вызывающая сторона не имеет
достаточные привилегии. Эта функция для принудительного запуска Хостинга
Сеть может быть вызвана только в том случае, если
привилегия. Разрешения хранятся в дискреционном контроле доступа
список (DACL), связанный с WLAN_SECURABLE_OBJECT. Чтобы позвонить
WlanHostedNetworkForceStart, токен клиентского доступа вызывающей стороны
должны иметь повышенные привилегии, представленные следующим перечислением в
WLAN_SECURABLE_OBJECT: wlan_secure_hosted_network_elevated_access

и поэтому:

Успешный вызов функции WlanSetSecuritySettings переопределяет
разрешения по умолчанию, связанные с объектом. Для большего
информацию о разрешениях по умолчанию, см. Native Wifi API
Права доступа. Ниже описана процедура создания
объект дескриптора безопасности и анализ его в виде строки. Вызов
InitializeSecurityDescriptor для создания дескриптора безопасности в
объем памяти. Вызовите SetSecurityDescriptorOwner, чтобы установить информацию о владельце.
для дескриптора безопасности. Вызовите InitializeAcl, чтобы создать
дискреционный список контроля доступа (DACL) в памяти. Вызов
AddAccessAllowedAce или AddAccessDeniedAce для добавления контроля доступа
записи (ACE) в DACL. Установите параметр AccessMask на один из
следующие побитовые комбинации ИЛИ в зависимости от ситуации: WLAN_READ_ACCESS
WLAN_READ_ACCESS | WLAN_EXECUTE_ACCESS WLAN_READ_ACCESS |
WLAN_EXECUTE_ACCESS | WLAN_WRITE_ACCESS Вызов SetSecurityDescriptorDacl
добавить DACL в дескриптор безопасности. Вызов
ConvertSecurityDescriptorToStringSecurityDescriptor для преобразования
дескриптор строки. Строка, возвращаемая
ConvertSecurityDescriptorToStringSecurityDescriptor затем может быть использован
в качестве значения параметра strModifiedSDDL при вызове
WlanSetSecuritySettings.

Итак, это мой код в первую очередь (WifiClass является статическим классом и elevateAccess () тоже статическим) — я выполнил все шаги из руководства выше:

bool WifiClass::elevateAccess() {

PSECURITY_DESCRIPTOR securityDescriptor = (PSECURITY_DESCRIPTOR)LocalAlloc(LMEM_FIXED, sizeof(PACL));
PACL pAcl = (PACL)LocalAlloc(LMEM_FIXED, sizeof(PACL));
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
PSID pEveryoneSID = NULL;
bool bRet, bRes = true;
DWORD dRet;bRet = InitializeSecurityDescriptor(securityDescriptor, SECURITY_DESCRIPTOR_REVISION);
if (!bRet)
{
bRes = false;
}

bRet = IsValidSecurityDescriptor(securityDescriptor);

bRet = AllocateAndInitializeSid(&SIDAuthWorld, 1,
SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0,
&pEveryoneSID);
if (!bRet)
{
bRes = false;
}

bRet = IsValidSecurityDescriptor(securityDescriptor);

bRet = SetSecurityDescriptorOwner(securityDescriptor, pEveryoneSID, TRUE);
if (!bRet)
{
bRes = false;
}

bRet = IsValidSecurityDescriptor(securityDescriptor);

DWORD cbAcl = sizeof(ACL) +
(sizeof(ACCESS_ALLOWED_ACE)) + (GetLengthSid(securityDescriptor) - sizeof(DWORD));
bRet = InitializeAcl(pAcl, cbAcl, ACL_REVISION);
if (!bRet)
{
bRes = false;
}

bRet = IsValidAcl(pAcl);

bRet = AddAccessAllowedAce(pAcl, ACL_REVISION, WLAN_READ_ACCESS | WLAN_EXECUTE_ACCESS | WLAN_WRITE_ACCESS, securityDescriptor);
if (!bRet)
{
bRes = false;
}

bRet = IsValidSecurityDescriptor(securityDescriptor);

bRet = SetSecurityDescriptorDacl(securityDescriptor, TRUE, NULL, FALSE);
if (!bRet)
{
bRes = false;
}

bRet = IsValidSecurityDescriptor(securityDescriptor);

LPWSTR* pStringSecurityDescriptor = new LPWSTR;
bRet = ConvertSecurityDescriptorToStringSecurityDescriptor(securityDescriptor,
SDDL_REVISION_1,
DACL_SECURITY_INFORMATION,
pStringSecurityDescriptor,
NULL
);
if (!bRet)
{
bRes = false;
}

WLAN_SECURABLE_OBJECT wso = wlan_secure_hosted_network_elevated_access;
dRet = WlanSetSecuritySettings(wlanHandle, wso, (LPCWSTR)pStringSecurityDescriptor);
if (dRet != ERROR_SUCCESS)
{
bRes = false;
}

return bRes;

}

МОЯ ПРОБЛЕМА: Кажется, все работает, все функции isValid всегда возвращают true. Единственная часть, которая не работает

ConvertSecurityDescriptorToStringSecurityDescriptor(securityDescriptor,
SDDL_REVISION_1,
DACL_SECURITY_INFORMATION,
pStringSecurityDescriptor,
NULL
);

Эта часть возвращается L"D:NO_ACCESS_CONTROL" в pStringSecurityDescriptor, И, как ожидается, следующая функция WlanSetSecuritySettings(wlanHandle, wso, (LPCWSTR)pStringSecurityDescriptor) возвращается 87:INVALID_PARAMETER поскольку строка явно не действительна.

ВОПРОС: Неужели я что-то не так после этого руководства Нужно ли что-то еще для инициализации или другие значения? Как мне исправить код?

1

Решение

Это потому, что SetSecurityDescriptorDacl () передается нулевым для DACL, поэтому он говорит, что есть NULL DACL. Должен быть передан pAcl вместо NULL, который работает для меня.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]