2010-10-19 44 views
7

我正在從Windows 2000(不問)到Windows 7移植應用程序,我需要複製允許用戶從GUI設置時間的功能。以前這是通過使用命令提示符直接調用'time'來完成的,但是在Windows 7中用戶權限似乎已經發生了一些變化。在Windows 7中以編程方式設置時間

已經完成了一些研究,看起來您可以使用請撥打kernel32.dll方法Win32SetSystemTime,但會出現相同的權限問題。閱讀MSDN我認爲我需要啓用SE_SYSTEMTIME_NAME,但無論我嘗試什麼,我似乎無法完成此項工作。

有沒有人有一些測試的示例代碼爲Windows 7允許API調用Win32SetSystemTime

+0

是。它改變時間,但不接受時區... – 2012-04-27 18:00:00

回答

7

不知道爲什麼它不爲你工作。以下代碼將時間設置爲今日下午4:12 UTC的時間。 (爲我工作)

public class Program 
{ 
    public struct SystemTime 
    { 
     public ushort Year; 
     public ushort Month; 
     public ushort DayOfWeek; 
     public ushort Day; 
     public ushort Hour; 
     public ushort Minute; 
     public ushort Second; 
     public ushort Millisecond; 
    }; 

    [DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)] 
    public extern static bool Win32SetSystemTime(ref SystemTime st); 

    public static void Main(string[] args) 
    { 
     SystemTime st = new SystemTime 
     { 
      Year = 2010, Month = 10, Day = 18, Hour = 16, Minute = 12, DayOfWeek = 1 
     }; 
    } 
} 

按照docs

調用進程必須有SE_SYSTEMTIME_NAME特權。該特權在默認情況下被禁用。 SetSystemTime函數在更改系統時間之前啓用SE_SYSTEMTIME_NAME特權,並在返回之前禁用特權。有關更多信息,請參閱使用特權運行。

所以看起來這應該不是一個問題。

+0

「調用進程必須具有SE_SYSTEMTIME_NAME特權」。有關分配該特權的任何想法? – 2010-10-19 02:18:33

+3

@Tim Joseph:管理員和其他幾個帳戶擁有此特權。您可以使用Sysinternals的Procexp來檢查授予每個進程的權限以及它們當前是否啓用。本地安全策略可以更改爲將權限分配給其他帳戶。 – 2010-10-19 06:08:33

+0

注意:我們應該將格林威治時間作爲參數'st'。系統根據其時區('GMT')設置。 – 2013-10-11 08:27:00

6

好吧,如果出現最壞的情況,總有

System.Diagnostics.Process.Start("CMD", "/C TIME 19:58"); // set time to 7:58PM 
+0

可悲的是,這似乎並沒有在Windows 7中工作。我得到錯誤「所需的特權不是由客戶端持有」。我的用戶是管理員,已經在3臺獨立的機器上驗證過。如果你有這方面的工作,我會很感激(就像許多其他人從我的研究中判斷的那樣) – 2010-10-19 01:09:10

+4

J .:你必須用提升的權限啓動該進程 – 2010-10-19 01:59:52

4

您的應用程序需要升級才能更改時間(因爲更改時間可能導致活動日誌等不真實),但不會更改時區。使用requireAdministrator將清單放在應用程序中,應用程序將升級。 (要在製作清單前對其進行測試,請右鍵單擊您的exe和Run As Adminstrator,這將只提升一次應用程序。升級與恰好在Administrators組中的人員啓動的方式不同。選擇到使用你的權力。)

機會是用戶不會像UAC提示,所以如果時間變化是罕見的,把它分解到一個單獨的EXE,把清單上的主要應用asInvoker和另一個關於requireAdministrator的時間轉換器,並且使用ShellExecute從主應用程序啓動時間轉換器。最好有一個按鈕或菜單項來實現這一點,並在其上放置一個盾牌圖標,以便UAC提示不會讓用戶感到意外。我拒絕UAC提示我沒有預料到。

相關問題