正如标题所说,我不太确定如何正确实施WlanSetSecuritySettings功能,以便从系统获得完全访问权限以便编辑WlanHostedNetwork from the native wlanapi( - > as I在某些系统上出错,就是说我没有访问权限,而且我需要提升!)。 在MSDN文档中,有以下手册如何执行此操作 - 我尽可能地遵循它:
如果托管网络,WlanHostedNetworkForceStart功能可能会失败 state是wlan_hosted_network_unavailable或调用者没有 足够的权限。此功能强制启动Hosted 只有在用户具有适当的关联时才能调用网络 特权。权限存储在自主访问控制中 列表(DACL)与WLAN_SECURABLE_OBJECT相关联。打电话给 WlanHostedNetworkForceStart,调用者的客户端访问令牌 必须具有由以下枚举公开的提升权限 WLAN_SECURABLE_OBJECT:wlan_secure_hosted_network_elevated_access
因此:
成功调用WlanSetSecuritySettings函数会覆盖 与对象关联的默认权限。更多 有关默认权限的信息,请参阅Native Wifi API 权限。以下描述了创建的过程 安全描述符对象并将其解析为字符串。呼叫 InitializeSecurityDescriptor在中创建安全描述符 记忆。调用SetSecurityDescriptorOwner来设置所有者信息 用于安全描述符。调用InitializeAcl来创建一个 内存中的自主访问控制列表(DACL)。呼叫 AddAccessAllowedAce或AddAccessDeniedAce以添加访问控制 DACL的条目(ACE)。将AccessMask参数设置为其中一个 遵循适当的按位OR组合: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
,因为String显然无效。
问题:本手册后有什么问题吗?我还需要其他东西来初始化或其他值吗?我该如何修复代码?
答案 0 :(得分:0)
这是因为SetSecurityDescriptorDacl()正在为DACL传递null,所以它说有一个NULL DACL。应该传递pAcl而不是NULL,这对我有用。