Frage

Was ist der beste Weg, um die Zeit einzustellen, die auf einem remote-Computer aus der Ferne?Der Rechner läuft mit Windows XP und den Erhalt der neuen Zeit über eine web-service-Aufruf.Das Ziel ist es, die remote-Rechnern synchron mit dem server.Das system ist gesperrt, so dass unser web-service ist der einzige Zugang, so dass ich nicht verwenden können, einen Zeit-server jede remote-Maschine.

War es hilfreich?

Lösung

Ich würde verwenden Sie die Windows-built-in internet-Zeit-Fähigkeiten.Sie können eine Zeit-server auf Ihrem server, haben es sich die Zeit von einem 2-tier-Zeitserver, und haben alle Ihre client-Geräte, die Zeit aus es.

Ich habe unten die Anwendung-Einstellungen-system-Zeit Straße vor.

Andere Tipps

Dies ist der Win32-API-Aufruf zum Einstellen der Systemzeit:

[StructLayout(LayoutKind.Sequential)] 
public struct SYSTEMTIME { 
 public short wYear; 
 public short wMonth; 
 public short wDayOfWeek; 
 public short wDay; 
 public short wHour; 
 public short wMinute; 
 public short wSecond; 
 public short wMilliseconds; 
 } 
 [DllImport("kernel32.dll", SetLastError=true)] 
public static extern bool SetSystemTime(ref SYSTEMTIME theDateTime ); 

Ich bin mir nicht ganz sicher, wie Sie die Sicherheit so ausgearbeitet bekommen würde, dass Sie diese Funktion auf dem Client ausführen kann, though.

Sie können viel mehr Detail erhalten Systemzeit auf Einstellung unter PInvoke .

Die Art und Weise ein Netzwerk Maschine abzufragen es Systemzeit ist, ist

Hier ist die Routine, die ich seit Jahren verwendet haben den DateTime Wert aus unseren unsere SQL Server zu lesen (mit Dateizeit), wandelt es in ein SYSTEMTIME, die auf dem PC eingestellt ist.

Dies funktioniert für PCs und Windows Mobile-Geräte.

Es kann jederzeit aufgerufen werden, passieren zu Ihrem SQL Server anrufen.

public class TimeTool {

  private static readonly DateTime NODATE = new DateTime(1900, 1, 1);

#if PocketPC
  [DllImport("coredll.dll")]
#else
  [DllImport("kernel32.dll")]
#endif
  static extern bool SetLocalTime([In] ref SYSTEMTIME lpLocalTime);

  public struct SYSTEMTIME {
    public short Year, Month, DayOfWeek, Day, Hour, Minute, Second, Millisecond;
    /// <summary>
    /// Convert form System.DateTime
    /// </summary>
    /// <param name="time">Creates System Time from this variable</param>
    public void FromDateTime(DateTime time) {
      Year = (short)time.Year;
      Month = (short)time.Month;
      DayOfWeek = (short)time.DayOfWeek;
      Day = (short)time.Day;
      Hour = (short)time.Hour;
      Minute = (short)time.Minute;
      Second = (short)time.Second;
      Millisecond = (short)time.Millisecond;
    }

    public DateTime ToDateTime() {
      return new DateTime(Year, Month, Day, Hour, Minute, Second, Millisecond);
    }

    public static DateTime ToDateTime(SYSTEMTIME time) {
      return time.ToDateTime();
    }
  }

  // read SQL Time and set time on device
  public static int SyncWithSqlTime(System.Data.SqlClient.SqlConnection con) {
    SYSTEMTIME systemTime = new SYSTEMTIME();
    DateTime sqlTime = NODATE;
    string sql = "SELECT GETDATE() AS [CurrentDateTime]";
    using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, con)) {
      try {
        cmd.Connection.Open();
        System.Data.SqlClient.SqlDataReader r = cmd.ExecuteReader();
        while (r.Read()) {
          if (!r.IsDBNull(0)) {
            sqlTime = (DateTime)r[0];
          }
        }
      } catch (Exception) {
        return -1;
      }
    }
    if (sqlTime != NODATE) {
      systemTime.FromDateTime(sqlTime); // Convert to SYSTEMTIME
      if (SetLocalTime(ref systemTime)) { //Call Win32 API to set time
        return 1;
      }
    }
    return 0;
  }

}

Sie könnten wahrscheinlich auch dies in einer Batch-Datei eine Kombination aus mit

TIME

die Zeit einzustellen, und

net time \\server_name

die Zeit von einem Server abgerufen werden.

scroll top