2

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

我查看了 StackO 和 MSDN(例如链接),但它们对我没有帮助,因为我无法弄清楚我做错了什么。

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;
}
4

2 回答 2

4

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

于 2013-08-02T16:41:54.393 回答
0

本页其他地方的评论不太正确;只要当前的用户帐户具有正确/相应的用户权限分配能力,您并不一定需要被提升才能获得特权。

具体来说,应用程序仍然可以使用默认asInvoker清单并确实启动,然后继续对“敏感”设置进行编程更改,所有这些都不会触发可怕的UAC提示。但同样,仅适用于指定用户。

运行SecPol.msc并转到:

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

在此处输入图像描述

根据您随后尝试的确切Win32 API, “SeBackupPrivilege”所需的相关权限可能包括以下各项:

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

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

                  ●●●</p>

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

于 2020-04-02T05:40:05.760 回答