2009-06-17 3 views

ответ

2

Служба времени Windows реализует NTP. Вот C# implementation of an NTP client. Используемый графический интерфейс Windows можно найти по адресу Simple Network Time Protocol Client. Это Валер Бокан.

+0

Если вы не можете запросить фактический удаленный сервер для своего времени; вы можете хотя бы запросить тот же контроллер домена/NTP-сервер и получить довольно схожее время. Использование ссылочного клиента NTP так же просто, как var client = new InternetTime.SNTPClient ("pkh-srv-dc03"); client.Connect (false); Console.WriteLine (client.DestinationTimestamp); –

3

Вы можете попытаться получить в дневное время на порт 13:

System.Net.Sockets.TcpClient t = new System.Net.Sockets.TcpClient ("yourmachineHOST", 13); 
System.IO.StreamReader rd = new System.IO.StreamReader (t.GetStream()); 
Console.WriteLine (rd.ReadToEnd()); 
rd.Close(); 
t.Close(); 
+0

Хороший простое решение, если удаленный сервер имеет порт 13 открыт ... Вы можете проверить довольно просто, открыт ли порт, используя телнет yourmachineHOST 13 и увидеть, если вы получите ответ –

5

Вы можете использовать функцию NetRemoteTOD.

Пример из http://bytes.com/groups/net-c/246234-netremotetod-usage:

// The pointer. 
IntPtr pintBuffer = IntPtr.Zero; 

// Get the time of day. 
int pintError = NetRemoteTOD(@"\\sony_laptop", ref pintBuffer); 

// Get the structure. 
TIME_OF_DAY_INFO pobjInfo = (TIME_OF_DAY_INFO) 
Marshal.PtrToStructure(pintBuffer, typeof(TIME_OF_DAY_INFO)); 

// Free the buffer. 
NetApiBufferFree(pintBuffer); 
+0

Простой и рабочий. Благодарю. –

+0

Работаю как шарм. И не нужен удаленный сервер для работы ** Windows Time Service ** (ответ @Reed Copsey) или ** порт 13 open ** (ответ @Zanoni) или ** доступ к файловой системе ** (@bluish answer). Этот подход работает с ** Windows 2000 или выше ** - отлично .. – bairog

0
+0

Прошу прощения, но этот ответ бесполезен, он указывает на тот же проект, что и ответ [@Reed Copsey] (http://stackoverflow.com/a/1008145/505893). Я вставлю вашу ссылку на этот ответ, и я думаю, что этот ответ должен быть закрыт. Благодаря! – bluish

1

Использование C# NTP client в Рид Copsey (& Дэвид Лэнг) ответ, вы можете получить время "сейчас" печать (в мс) с/сервера NTP контроллера домена с помощью:

InternetTime.SNTPClient sntp = new InternetTime.SNTPClient("ntp1.ja.net"); 
sntp.Connect(false); // true to update local client clock 
DateTime dt = sntp.DestinationTimestamp.AddMilliseconds(sntp.LocalClockOffset); 
string timeStampNow = dt.ToString("dd/MM/yyyy HH:mm:ss.fff"); 
+1

Вы можете опубликовать этот код в ответ [@Reed Copsey] (http://stackoverflow.com/a/1008145/505893), поэтому он будет расширен и будет понятен будущим читателям. ;) – bluish

0

Если у вас есть доступ к файловой системе удаленной системы с UNC-адресом (например, с помощью проводника Windows), вы можете получить удаленное datetime, , даже если это не система Windows, со следующими обходным путем. Создайте фиктивный файл, прочитайте его время записи и выбросьте его. Он также работает для локального хоста.

public DateTime filesystemDateTime(string path) 
{ 
    //create temp file 
    string tempFilePath = Path.Combine(path, "lampo.tmp"); 
    using (File.Create(tempFilePath)) { } 
    //read creation time and use it as current source filesystem datetime 
    DateTime dt = new FileInfo(tempFilePath).LastWriteTime; 
    //delete temp file 
    File.Delete(tempFilePath); 

    return dt; 
} 
0
class RemoteSystemTime 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       string machineName = "vista-pc"; 

       System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
       proc.StartInfo.UseShellExecute = false; 
       proc.StartInfo.RedirectStandardOutput = true; 
       proc.StartInfo.FileName = "net"; 
       proc.StartInfo.Arguments = @"time \\" + machineName; 
       proc.Start(); 
       proc.WaitForExit(); 

       List<string> results = new List<string>(); 
       while (!proc.StandardOutput.EndOfStream) 
       { 
        string currentline = proc.StandardOutput.ReadLine(); 
        if (!string.IsNullOrEmpty(currentline)) 
        { 
         results.Add(currentline); 
        } 
       } 

       string currentTime = string.Empty; 
       if (results.Count > 0 && results[0].ToLower().StartsWith(@"current time at \\" +            machineName.ToLower() + " is ")) 
       { 
        currentTime = results[0].Substring((@"current time at \\" + machineName.ToLower() + " is        ").Length); 

        Console.WriteLine(DateTime.Parse(currentTime)); 
        Console.ReadLine(); 
       } 

      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
       Console.ReadLine(); 
      } 
     } 
+1

Обратите внимание, что «текущее время в» неверно, если язык не является английским на вашем локальном компьютере. – bairog

+0

BTW: ** команда NET TIME ** использует ** функцию NetRemoteTOD ** (из ответа @Patrick McDonald): http://blogs.msdn.com/b/w32time/archive/2009/08/07/net-time и-w32time.aspx – bairog

Смежные вопросы