2011-05-23 130 views
2

操作系统: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 

你有一个想法如何解决我的问题呢?

谢谢您的回答, 阿兰

+1

阿兰,有问题的代码可能值得一看。 – 2011-05-23 11:01:20

+0

目前还不清楚,为什么你调用'DuplicateToken',以及为什么你试图设置系统时间*在*之后停止模拟。 – Gabe 2011-05-23 12:07:26

+0

嗨Gabe,DuplicateToken用于因为我可以保持wic,但在我的例子中,这是没有必要的。我在SetSystemTime之前停止模仿,因为impersonate仅用于启用有限用户accout的“SeSystemtimePrivilege”特权。我试图使用模拟,所以SetSystemTime被称为管理员特权,但它不起作用。 – Alain 2011-05-23 12:24:32

回答

1

我最近发布了一个类似的问题,不同的角度,但基本需求相同,问题的标题是“如何检查本地安全策略权限为非管理员”以供参考。

无论如何,如果您在本地安全策略中明确授予标准用户“更改系统时间”权限,则该非管理员可以访问SetSystemTime。我在我的问题中解释了我是如何解决我的特殊需求的,或许它可以帮助你?

祝你好运!