2014-02-12 78 views
0

我們正在準備推出我們新產品的測試版,由於我們還沒有放入授權組件,因此我們決定只加入一個定時炸彈,以便測試版在發佈後無法使用某個日期。顯然,我們不想僅僅相信系統時間,因爲這很容易回滾。如何通過SNTP查詢當前網絡的當前日期時間?

我們已經在互聯網上對幾個不同的NTP服務器進行了檢查,並且對一些主要網站的HTTP響應標題中的時間進行了一些檢查,但是我們的軟件適用於未曾聽說過的行業有一個安全的本地網絡,沒有互聯網接入。因此,我們認爲通過SNTP(或NTP,如果更容易)從本地網絡的時間服務器(如果有的話)獲得日期會很好。

儘管我們只需要一個簡單的查詢,但我在網上看到的所有C#SNTP示例都是功能齊全的客戶端,它們能夠保持機器的系統時間同步,並充當本地NTP服務器,配置它們,這對我們的需求來說是完全過度的。

任何人都可以解釋如何做這樣的廣播查詢?我們所需的NTP查詢代碼需要一個特定的地址來連接,顯然我們不會知道客戶的本地網絡。

回答

0

只記得這個問題,想我會後我找到了解決辦法:

var cmd = new System.Diagnostics.Process 
{ 
    StartInfo = 
    { 
     FileName = "cmd.exe", 
     WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden, 
     RedirectStandardOutput = true, 
     Arguments = "/C net time /DOMAIN:" + Environment.UserDomainName, 
     UseShellExecute = false 
    } 
}; 

cmd.Start(); 

string output = cmd.StandardOutput.ReadToEnd(); 
if (output.EndsWith("The command completed successfully.\r\n\r\n")) 
{ 
    int is_index = output.IndexOf("is "); 
    int serv_start = output.IndexOf(@"\\") + 2; 
    int serv_end = is_index - 1; 
    string time_server = output.Substring(serv_start, serv_end - serv_start).Split(new char[] { '.' })[0]; 
    if (time_server == Environment.MachineName) 
     return DateTime.MaxValue; // local machine is acting as time server 

    int time_start = is_index + 3; 
    int time_end = output.IndexOf("\r"); 
    string local = output.Substring(time_start, time_end - time_start); 
    return DateTime.ParseExact(local, "M/d/yyyy h:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture); 
} 

return DateTime.MaxValue; 

這會從域的時間服務器的當前時間;如果命令失敗,或者如果本地計算機是時間服務器(如果您信任系統時間,您爲什麼要檢查本地網絡?),它將返回DateTime.MaxValue。爲簡潔起見,異常處理已被省略。

我做了不是調查了什麼樣的文化net time用來格式化它的輸出,因此可能有必要使用InvariantCulture以外的東西。

相關問題