AdjustTokenPrivileges错误ERROR_NOT_ALL_ASSIGNED

时间:2013-08-02 16:37:47

标签: c++ windows winapi visual-c++ privileges

请告知以下代码中指出的错误,为什么会发生这种情况? 我是C ++的新手。

我看过StackO,MSDN也看了(例如link),但他们对我没有帮助,因为我无法弄清楚我做错了什么。

HANDLE hToken;

if (!OpenProcessToken(GetCurrentProcess(), 
    TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
{
    return FALSE;
}

{
SetPrivilege(hToken,L"SeBackupPrivilege",1 );

BOOL SetPrivilege(
HANDLE hToken,          // access token handle
LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
BOOL bEnablePrivilege   // to enable or disable privilege
) 
{
TOKEN_PRIVILEGES tp;
DWORD cb=sizeof(TOKEN_PRIVILEGES);
LUID luid;

if ( !LookupPrivilegeValue( 
        NULL,            // lookup privilege on local system
        lpszPrivilege,   // privilege to lookup 
        &luid ) )        // receives LUID of privilege
{
    printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
    return FALSE; 
}

tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
    tp.Privileges[0].Attributes = 0;

// Enable the privilege or disable all privileges.

   if ( !AdjustTokenPrivileges(
       hToken, 
       FALSE, 
       &tp, 
       cb, 
       NULL, 
       NULL) )
{ 
      printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); 
      return FALSE; 
} 

if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) // This is True. Why??

{
      printf("The token does not have the specified privilege. \n");
      return FALSE;

    /*
    The token does not have one or more of the privileges specified in the NewState parameter. 
    The function may succeed with this error value even if no privileges were adjusted. 
    The PreviousState parameter indicates the privileges that were adjusted.
    */
} 

return TRUE;
}

2 个答案:

答案 0 :(得分:4)

您不能授予自己尚未拥有的权限。其他一些流程(具有更高权限)必须将它们授予您。

答案 1 :(得分:0)

此页面其他地方的评论不太正确;只要当前的用户帐户具有正确的权限,您 确实需要提升以获取特权/相应的用户权限分配功能。

具体来说,一个应用can still use the default asInvoker manifest确实启动,然后继续对“敏感”设置进行编程更改,所有没有都曾触发可怕的 UAC 提示。但同样,仅适用于指定用户。

运行 SecPol.msc 并转到:

Security Settings \ Local Policies \ User Rights Assignment \ ...

enter image description here

根据您随后尝试使用的 Win32 API的不同,“ SeBackupPrivilege” 所需的相关特权可能包括以下内容:

Restore files and directories
Back up files and directories
Bypass traverse checking

双击您认为应该拥有的用户权限分配策略的文字描述,然后点击添加用户或组... 以添加自己(我们必须假设您已经知道如何在拜占庭式安全用户界面中查找或选择用户和组)

“ SeBackupPrivilege” 相关的是“ SeManageVolumePrivilege” 特权,我碰巧发现它对我的特定目标更有用。后者似乎需要在此处显示的 SecPol.msc 实用工具中添加“执行卷维护任务” 功能。