Was ist die beste Möglichkeit, um die Zeit auf einem Remote-Computer remote festzulegen? Auf dem Computer wird Windows XP ausgeführt und die neue Zeit wird über einen Webdienstanruf empfangen. Das Ziel besteht darin, die Remote-Maschinen mit dem Server synchron zu halten. Das System ist gesperrt, so dass unser Webdienst der einzige Zugriff ist. Daher kann ich keinen Zeitserver auf jedem Remotecomputer verwenden.Zeit programmgesteuert mit C# festlegen
Antwort
Ich würde Windows integrierte Internet-Zeit-Fähigkeiten verwenden. Sie können eine time server auf Ihrem Server einrichten, Zeit von einem Zeitserver der 2. Stufe bekommen lassen und alle Ihre Client-Maschinen bekommen Zeit davon.
Ich habe die Application-Setting-System-Zeit Straße vorher runter.
Dies ist der Win32-API-Aufruf Systemzeit für die Einstellung:
[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 gearbeitet bekommen würden heraus, so dass Sie diese Funktion auf dem Client ausführen konnten, though.
Sie können viel detaillierter über die Einstellung der Systemzeit unter PInvoke erfahren.
+1, BTW, ich fand diesen Link mit einem vollständigen Quellcode. http://www.pcreview.co.uk/forums/thread-2085327.php –
Keine Ahnung warum, aber das gab +2 Stunden für mich nach jedem Satz. Also setzt die Zeit 2011.04.23 7:20 ... Ergebnis 2011.04.23 9:20 statt. Seltsam, aber wenn ich versuche: 2001.03.05 01:55, hat es gut geklappt. –
Wie stellt dies die Zeit auf einem Remote-Rechner ein? –
Die Abfrage einer Netzwerkmaschine für die Systemzeit ist NetRemoteTOD.
Hier ist Code, um es in Delphi zu tun (ein Verwendungsbeispiel ist unten veröffentlicht).
Da es auf Windows API-Aufrufe beruht, sollte es in C# nicht zu unterschiedlich sein.
unit TimeHandler;
interface
type
TTimeHandler = class
private
FServerName : widestring;
public
constructor Create(servername : widestring);
function RemoteSystemTime : TDateTime;
procedure SetLocalSystemTime(settotime : TDateTime);
end;
implementation
uses
Windows, SysUtils, Messages;
function NetRemoteTOD(ServerName :PWideChar; var buffer :pointer) : integer; stdcall; external 'netapi32.dll';
function NetApiBufferFree(buffer : Pointer) : integer; stdcall; external 'netapi32.dll';
type
//See MSDN documentation on the TIME_OF_DAY_INFO structure.
PTime_Of_Day_Info = ^TTime_Of_Day_Info;
TTime_Of_Day_Info = record
ElapsedDate : integer;
Milliseconds : integer;
Hours : integer;
Minutes : integer;
Seconds : integer;
HundredthsOfSeconds : integer;
TimeZone : LongInt;
TimeInterval : integer;
Day : integer;
Month : integer;
Year : integer;
DayOfWeek : integer;
end;
constructor TTimeHandler.Create(servername: widestring);
begin
inherited Create;
FServerName := servername;
end;
function TTimeHandler.RemoteSystemTime: TDateTime;
var
Buffer : pointer;
Rek : PTime_Of_Day_Info;
DateOnly, TimeOnly : TDateTime;
timezone : integer;
begin
//if the call is successful...
if 0 = NetRemoteTOD(PWideChar(FServerName),Buffer) then begin
//store the time of day info in our special buffer structure
Rek := PTime_Of_Day_Info(Buffer);
//windows time is in GMT, so we adjust for our current time zone
if Rek.TimeZone <> -1 then
timezone := Rek.TimeZone div 60
else
timezone := 0;
//decode the date from integers into TDateTimes
//assume zero milliseconds
try
DateOnly := EncodeDate(Rek.Year,Rek.Month,Rek.Day);
TimeOnly := EncodeTime(Rek.Hours,Rek.Minutes,Rek.Seconds,0);
except on e : exception do
raise Exception.Create(
'Date retrieved from server, but it was invalid!' +
#13#10 +
e.Message
);
end;
//translate the time into a TDateTime
//apply any time zone adjustment and return the result
Result := DateOnly + TimeOnly - (timezone/24);
end //if call was successful
else begin
raise Exception.Create('Time retrieval failed from "'+FServerName+'"');
end;
//free the data structure we created
NetApiBufferFree(Buffer);
end;
procedure TTimeHandler.SetLocalSystemTime(settotime: TDateTime);
var
SystemTime : TSystemTime;
begin
DateTimeToSystemTime(settotime,SystemTime);
SetLocalTime(SystemTime);
//tell windows that the time changed
PostMessage(HWND_BROADCAST,WM_TIMECHANGE,0,0);
end;
Und hier ist das Verwendungsbeispiel:
procedure TfrmMain.SynchLocalTimeWithServer;
var
tod : TTimeHandler;
begin
tod := TTimeHandler.Create(cboServerName.Text);
try
tod.SetLocalSystemTime(tod.RemoteSystemTime);
finally
FreeAndNil(tod);
end; //try-finally
end;
Ich bin neugierig, warum das abgelehnt wurde. – JosephStyons
Ich nehme an, dass dies abgelehnt wurde, weil die Frage mit C# Label gestellt wird, aber Sie haben mit Delphi/Pascal Beispielen geantwortet – evilone
Sie könnten auch dies wahrscheinlich tun in einer Batch-Datei
auf die Zeit einstellen, eine Kombination aus
TIME
verwenden und
net time \\server_name
zum Abrufen der Zeit von einem Server.
Hier ist die Routine, die ich seit Jahren verwende, um den DateTime
Wert von unserem SQL Server (mit Dateizeit) zu lesen, konvertieren Sie es in eine SYSTEMTIME
, die auf dem PC festgelegt ist.
Dies funktioniert für PCs und Windows Mobile-Geräte.
Sie kann jederzeit aufgerufen werden, wenn Sie Ihren SQL Server aufrufen.
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;
}
}
- 1. WatchKit: WKInterfaceImage programmgesteuert festlegen
- 2. AutoLayout-Größenklasse programmgesteuert festlegen?
- 3. Einschränkungen programmgesteuert festlegen
- 4. ActionMode Hintergrund programmgesteuert festlegen
- 5. ProzentualRelativeLayout-Rand programmgesteuert festlegen
- 6. NSWindow Größe programmgesteuert festlegen
- 7. ASP.NET MVC6: Webroot programmgesteuert festlegen
- 8. XAML TextBlock Sonderzeichen programmgesteuert festlegen?
- 9. Arbeitsebene für Element programmgesteuert festlegen?
- 10. Logback Appender-Pfad programmgesteuert festlegen
- 11. Programmgesteuert Outlook Signature Standards festlegen?
- 12. Möglich BroadcastReceiver Priorität programmgesteuert festlegen?
- 13. Wie programmgesteuert NSView-Größe festlegen?
- 14. Wert programmgesteuert auf 4.0.2 festlegen
- 15. Festlegen von statischen Zellen in uitableview programmgesteuert
- 16. Wie programmgesteuert eine globale (Modul) Variable festlegen?
- 17. Druckeinstellungen programmgesteuert für Diagrammsteuerung (Mscharts) festlegen
- 18. Wie programmgesteuert Gewicht für Schaltfläche festlegen
- 19. UINavigationBar - Titel programmgesteuert festlegen? iPhone SDK 4
- 20. Android: Winkel Eigenschaft von GradientDrawable programmgesteuert festlegen?
- 21. Wie programmgesteuert den Standard App Launcher festlegen?
- 22. Festlegen der untergeordneten Layoutbreite programmgesteuert In ANDROID?
- 23. Pause/Stop MediaPlayer Android zu gegebener Zeit programmgesteuert
- 24. Die Masterseite einer Masterseite programmgesteuert festlegen
- 25. Den Titel einer UIPopOver-Ansicht programmgesteuert festlegen
- 26. AppEngine für Java-Umgebung programmgesteuert festlegen
- 27. Festlegen von Flat Button-Stil programmgesteuert
- 28. Festlegen von Stilen für programmgesteuert hinzugefügte Ansichten
- 29. Wie programmgesteuert Tabellenname in PL/SQL festlegen?
- 30. Berechtigung für Benutzer programmgesteuert festlegen? (Sharepoint)
Ich werde das unterstützen. Das Zeitprotokoll ist ein Schmerz in den Hintern, um richtig zu werden. Verwenden Sie wenn möglich den eingebauten Dienst. –