2014-02-12 40 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以外的东西。

相关问题