2012-08-22 26 views
5

我的应用使用SetSystemTime()来设置来自GPS源的PC时钟。在禁用了用户帐户控制的Windows 7中,此工作正常,但在Windows 8中,即使禁用了UAC,也会失败。我得到的错误是ERROR_PRIVILEGE_NOT_HELD。登录到计算机的用户在管理员组中。如果我在资源管理器中的文件的上下文菜单中以“以管理员身份运行”运行应用程序,我只能让它工作 - 但登录用户是管理员。无法在Windows 8上使用SetSystemTime设置时钟

所以......我需要做什么不同的Windows 8获得SetSysytemTime()工作?我是否需要比当前用户的管理员权限更高的特权?如果是这样,什么比管理员有更高的特权?或者是否需要以不同的方式设置用户帐户以允许这些类型的呼叫在Windows 8上运行?

编辑:如前所述的意见,手动试图使SE_SYSTEMTIME_NAME权限不起作用。尝试使用LsaAddAccountRights的建议MSDN方法添加权限。

+0

“UAC禁用”角度是一个非常阴暗的角度,它不能被禁用afaik。几乎肯定不是在Win8上,底层管道用于提供Metro应用运行的沙箱。您需要一个清单来请求提升或从已升级的进程启动您的应用程序。 –

+0

它提供了关闭UAC的选项......所以它实际上没有被禁用吗?多烦人! –

+2

“调用进程必须具有SE_SYSTEMTIME_NAME特权,默认情况下此特权被禁用,SetSystemTime函数在更改系统时间之前启用SE_SYSTEMTIME_NAME特权,并在返回之前禁用特权,有关详细信息,请参阅使用特权运行。 - 也许在Windows 8中,这个特权不​​会自动启用,你必须用AdjustTokenPrivileges()自己来完成。可能值得尝试。 –

回答

3

我认为这可能与以下事实有关:在Windows 8上禁用UAC时,进程(默认情况下)以中等完整性(非完整性)运行(请参阅this post)。

我认为你需要在你的application manifest

+0

感谢达米安,这是有道理的。尽管如此烦人。我明白为什么微软希望(/需要)这样做,它只是打破了我们的应用程序需要将系统时钟与我们的服务器服务同步的需求,因为客户端应用程序必须能够在许多系统中无需用户交互即可运行(某些用户将不会有管理登录来提升进程,但应用程序仍然需要该级别的权限来执行低级别的事情)。将不得不考虑我认为的解决方法,因为提升权限的提示并不实际。 –

+1

@NickShaw - 好吧,它*是一项特权操作。如果用户无权执行该操作,那么现在是时候将该程序作为服务重写(部分?)了? –

+0

奇怪的是,我的登录用户可以在没有任何提示的情况下更改时钟,但是我的应用程序在同一用户下运行则不能,除非我专门以“管理员身份”运行它。 虽然我同意;有服务做这些特权操作可能是最好的方式。 –

4

要求requireAdministrator如果将UAC滑块向下完全在“用户账户控制设置”,这意味着UAC不会显示任何提示,但仍处于启用状态。任何普通进程仍然没有管理权限运行,但是在没有用户同意的情况下(通过“以管理员身份运行”或通过声明“requireAdministrator”)来提升。

禁用安全策略“用户帐户控制:以管理员批准模式运行所有管理员”或注册表项“EnableLUA”设置为0,将改变这种行为,但防止所有地铁现代UI运行的应用程序。

如果用户没有管理权限,你不能没有使用服务更改系统时钟。

如果你希望你的应用程序对于普通用户(自动)提升为管理员通常(但没有特殊权利)开始,你可能想在你的清单申报“highestAvailable”。

+0

谢谢菲利克斯,有用的知道。看起来我会写一份服务来完成这项工作! :) –

相关问题