【发布时间】:2012-08-22 15:08:07
【问题描述】:
我的应用使用SetSystemTime() 从 GPS 源设置 PC 时钟。这在禁用用户帐户控制的 Windows 7 中运行良好,但在 Windows 8 中,即使禁用了 UAC,它也会失败。我回来的错误是ERROR_PRIVILEGE_NOT_HELD。登录到机器的用户属于管理员组。如果我从资源管理器的文件上下文菜单中以“以管理员身份运行”运行应用程序,我只能让它工作 - 但登录用户是管理员。
那么...我需要在 Windows 8 上做些什么不同的事情才能让SetSysytemTime() 工作?我是否需要比当前用户的管理员权限更高的权限?如果是这样,什么比管理员具有更高的权限?还是我需要对用户帐户进行不同的设置以允许此类调用在 Windows 8 上运行?
编辑:如 cmets 中所述,手动尝试启用 SE_SYSTEMTIME_NAME 权限不起作用。也不会尝试使用建议的 MSDN 方法 LsaAddAccountRights 添加权限。
【问题讨论】:
-
“UAC 禁用”角度是一个非常模糊的角度,它不能被禁用 afaik。几乎绝对不是在 Win8 上,底层管道用于提供运行 Metro 应用程序的沙箱。您需要一个清单来请求提升或从已提升的进程启动您的应用。
-
它提供了关闭 UAC 的选项......那么它实际上并没有被禁用吗?真烦人!
-
"调用进程必须有SE_SYSTEMTIME_NAME权限,默认关闭该权限。SetSystemTime函数在更改系统时间前开启SE_SYSTEMTIME_NAME权限,在返回前关闭该权限。更多信息参见运行享有特殊特权。” -- 也许在 Windows 8 中,权限不再自动启用,您必须自己使用 AdjustTokenPrivileges() 来实现?可能值得一试。
-
谢谢乔纳森,我会试试看的。
-
好的,我已经尝试调整令牌权限 - 它仍然失败。它声称不拥有该特权,因此无法启用它。猜猜我只需要启用安全策略中的权限,或者使用
LsaAddAccountRights将其添加到用户的帐户权限中?...