c ++ - 为WlanHostedNetwork-functions

时间:2017-09-18 12:28:56

标签: c++ security networking access wlan

正如标题所说,我不太确定如何正确实施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显然无效。

问题:本手册后有什么问题吗?我还需要其他东西来初始化或其他值吗?我该如何修复代码?

1 个答案:

答案 0 :(得分:0)

这是因为SetSecurityDescriptorDacl()正在为DACL传递null,所以它说有一个NULL DACL。应该传递pAcl而不是NULL,这对我有用。