Как видно из названия, я не совсем уверен, как правильно реализовать 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
поскольку строка явно не действительна.
ВОПРОС: Неужели я что-то не так после этого руководства Нужно ли что-то еще для инициализации или другие значения? Как мне исправить код?
Это потому, что SetSecurityDescriptorDacl () передается нулевым для DACL, поэтому он говорит, что есть NULL DACL. Должен быть передан pAcl вместо NULL, который работает для меня.
Других решений пока нет …