2015-09-05 39 views
-1

我想通過編程修改系統時間在C#(在Windows 8.1)和 我用Win32SetSystemTime和setSystemTime:win32set時間返回錯誤8.1

我設置權限之前,我調用這些功能,並設置權限返回true,但是當我調用Win32SetSystemTime或setSystemTime時,我得到錯誤1300和1314,系統時間根本沒有改變。 這些錯誤是關於特權! 而且每當我以管理員身份運行應用程序時,他們都能正常工作! 我用下面的代碼來設置權限:

 string privilege = "SE_SYSTEMTIME_NAME"; 

     try 
     { 
      bool retVal; 
      TokPriv1Luid tp; 
      IntPtr hproc = GetCurrentProcess(); 
      IntPtr htok = IntPtr.Zero; 
      retVal = OpenProcessToken(hproc,TOKEN_ALL_ACCESS , ref htok); 
      // retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok); 
      tp.Count = 1; 
      tp.Luid = 0; 
      tp.Attr = SE_PRIVILEGE_ENABLED; 
      retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid); 
      retVal = AdjustTokenPrivileges(htok, false, ref tp, 0,   IntPtr.Zero, IntPtr.Zero); 
      return retVal; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
+0

提升權限並不是那麼簡單,你必須[很好地提出](http://stackoverflow.com/a/2818776/ 17034).. –

回答

1

設置系統時間需要管理員權限。這意味着以管理員身份運行該過程。

UAC進程默認情況下以標準用戶身份運行。您將需要使用各種方式之一以管理員身份運行您的流程。例如,通過在清單中指定requireAdministrator選項。最佳做法是隻提升需要提升的操作。這涉及到爲這些管理任務創建一個單獨的進程。

您還可以擺脫問題中的所有代碼,因爲當以管理員身份運行時,默認情況下令牌已經包含必要的特權來更改時間。

我不確定Win32SetSystemTime是什麼。您需要撥打的功能是SetSystemTime。 MSDN上的這個例子展示瞭如何做到這一點,儘管作者相當懶惰地省略了錯誤檢查:https://msdn.microsoft.com/en-us/library/ms172517(v=vs.90).aspx

+0

謝謝你的回答,但我添加一個清單文件到我的項目中,並設置並在我的項目屬性中設置清單引用,但仍然當我想設置t系統時間我再次得到以前的錯誤! –

+0

您需要刪除問題中的所有代碼並調用SetSystemTime。另外,你說什麼不符合「每當我作爲管理員運行應用程序,他們工作正常」 –

+0

我想也許清單文件不工作的項目屬性!? –