我正在使用以下函数对从以下位置获取的令牌禁用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;
}
答案 0 :(得分:3)
AdjustTokenPrivileges()
只会对当前流程产生任何影响。你可以使用LsaRemoveAccountRights()
,但这对于你想要实现的目标来说是极端的。此外,如果用户是管理员,他们可以直接重新授予他们的帐户(并且在他们退出并再次登录之前不会产生任何影响)。
无论你想做什么,依赖客户机来获取你的业务逻辑看起来都是错误的方法。
答案 1 :(得分:0)
正如评论和之前的回答已经指出的那样,你需要一把非常大的锤子。有一个这样的锤子:GINA.DLL
。通过提供自定义GINA.DLL,WinLogon
执行的登录处理可以是tailored。