如何禁用Windows用户通过AdjustTokenPrivileges手动更改系统时间的能力?

时间:2012-01-19 20:29:08

标签: c++ windows security

我正在使用以下函数对从以下位置获取的令牌禁用SeSystemtimePrivilege:

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);

该函数运行时没有错误,但仍然可以在Windows 7中手动更改时间。我认为这是因为我正在设置当前进程(我的程序)的权限,而不是当前用户。有没有办法为当前登录的用户获取访问令牌,或者我应该获取日期/时间控制面板的令牌,还是有另一种方式我应该接近这个?

同样,目标是Win7登录用户无法更改系统时间。我无法访问目标计算机上的组策略,因此我必须以编程方式禁用此功能。该程序是ATL / MFC,因此如果有帮助,我可以访问CAccessToken类。

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;
    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, 
           sizeof(TOKEN_PRIVILEGES), 
           (PTOKEN_PRIVILEGES) NULL, 
           (PDWORD) NULL) )
    { 
          printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); 
          return FALSE; 
    } 

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)

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

    return TRUE;
}

2 个答案:

答案 0 :(得分:3)

AdjustTokenPrivileges()只会对当前流程产生任何影响。你可以使用LsaRemoveAccountRights(),但这对于你想要实现的目标来说是极端的。此外,如果用户是管理员,他们可以直接重新授予他们的帐户(并且在他们退出并再次登录之前不会产生任何影响)。

无论你想做什么,依赖客户机来获取你的业务逻辑看起来都是错误的方法。

答案 1 :(得分:0)

正如评论和之前的回答已经指出的那样,你需要一把非常大的锤子。有一个这样的锤子:GINA.DLL。通过提供自定义GINA.DLL,WinLogon执行的登录处理可以是tailored