使用SetSystemTime以受限用户帐户
操作系统:Windows XP(嵌入式) 语言:C#使用SetSystemTime以受限用户帐户
问题: 随着受限用户帐户,我试图改变Windows XP中的日期和时间编程,由使用函数SetSystemTime()但它返回false并且错误代码是5:访问被拒绝。
阅读MSDN文章后,我通过使用LogonUser()和Impersonate()函数将模拟有限用户帐户给管理员用户(属于管理员组并具有更改系统时间的权限),并在SetSystemTime()但结果与以前一样。
我尝试在调用AdjustTokenPrivileges()之前模拟它,然后返回无错误,但结果与以前相同之后,将特权“SeSystemtimePrivilege”授予有限用户帐户。
代码:
const int SE_PRIVILEGE_ENABLED = 2;
// Starting with limited user account
intPtr userToken = WindowsIdentity.GetCurrent(TokenAccessLevels.AdjustPrivileges | TokenAccessLevels.Query).Token;
IntPtr tokenDuplicate = IntPtr.Zero;
IntPtr token = IntPtr.Zero;
LogonUser("administrator", domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token);
DuplicateToken(token, 2, ref tokenDuplicate);
WindowsImpersonationContext wic = (new WindowsIdentity(tokenDuplicate)).Impersonate();
bool enabled = true;
TOKEN_PRIVILEGES tokenPrivilege = new TOKEN_PRIVILEGES();
tokenPrivilege.PrivilegeCount = 1;
tokenPrivilege.Privileges = new LUID_AND_ATTRIBUTES[tokenPrivilege.PrivilegeCount];
tokenPrivilege.Privileges[0].Attributes = (UInt32)(enabled ? SE_PRIVILEGE_ENABLED : SE_PRIVILEGE_DISABLED);
if (LookupPrivilegeValue(null, "SeSystemtimePrivilege", out tokenPrivilege.Privileges[0].Luid))
AdjustTokenPrivileges(userToken, false, ref tokenPrivilege, (UInt32)Marshal.SizeOf(typeof(TOKEN_PRIVILEGES)), IntPtr.Zero, IntPtr.Zero);
// Return to limited user account
wic.Undo();
if(!SetSystemTime(systemTime)) // systemTime in UTC time
.... Error code here, 5 if I let administrator impersonate or 1314
你有一个想法如何解决我的问题呢?
谢谢您的回答, 阿兰
请参阅这篇文章:http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/c98a6b72-2330-4dee-b740-a3ab666b1f4b/。这个问题不能解决。
你确定吗?似乎有一个帖子有点过分,说明了如何完成。 (但我不知道这个主题) – nhahtdh 2013-03-06 09:36:36
我最近发布了一个类似的问题,不同的角度,但基本需求相同,问题的标题是“如何检查本地安全策略权限为非管理员”以供参考。
无论如何,如果您在本地安全策略中明确授予标准用户“更改系统时间”权限,则该非管理员可以访问SetSystemTime。我在我的问题中解释了我是如何解决我的特殊需求的,或许它可以帮助你?
祝你好运!
阿兰,有问题的代码可能值得一看。 – 2011-05-23 11:01:20
目前还不清楚,为什么你调用'DuplicateToken',以及为什么你试图设置系统时间*在*之后停止模拟。 – Gabe 2011-05-23 12:07:26
嗨Gabe,DuplicateToken用于因为我可以保持wic,但在我的例子中,这是没有必要的。我在SetSystemTime之前停止模仿,因为impersonate仅用于启用有限用户accout的“SeSystemtimePrivilege”特权。我试图使用模拟,所以SetSystemTime被称为管理员特权,但它不起作用。 – Alain 2011-05-23 12:24:32