我们正在准备推出我们的一个新产品的测试版,而且由于我们还没有加入授权组件,所以我们决定在某个特定的日期之后,我们只会放一个定时炸弹,这样测试版就不能工作了。显然,我们不想只相信系统时间,因为这很容易回滚。
我们已经对互联网上的几个不同的NTP服务器进行了检查,也对一些主要网站的HTTP响应头中的时间进行了一些检查,但我们的软件是打算在一个没有互联网接入的安全本地网络的行业中使用。因此,我们认为最好通过SNTP (或者NTP )从本地网络的时间服务器(如果有)获得一个日期,如果这样更容易的话。
不过,我们只需要一个简单的查询,而我在网上看到的所有C# SNTP示例都是功能齐全的客户端,它们能够使机器的系统时间保持同步,并充当您想要配置它们的任何阶层的本地NTP服务器,这对我们的需要来说是完全过分的。
有人能解释一下怎么做这样的广播查询吗?我们所拥有的NTP查询代码需要一个特定的地址来连接,显然,对于客户的本地网络,我们不会知道这个地址。
发布于 2014-06-16 21:50:38
刚记起这个问题,我想我应该把我找到的解决办法:
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以外的其他东西。
https://stackoverflow.com/questions/21739481
复制相似问题