2012-08-22 40 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

謝謝菲利克斯,有用的知道。看起來我會寫一份服務來完成這項工作! :) –

相關問題