¿Cuál es la mejor manera de configurar el tiempo en una máquina remota de forma remota? La máquina ejecuta Windows XP y recibe la nueva hora a través de una llamada de servicio web. El objetivo es mantener las máquinas remotas sincronizadas con el servidor. El sistema está bloqueado para que nuestro servicio web sea el único acceso, por lo que no puedo usar un servidor horario en cada máquina remota.Configure la hora programáticamente usando C#
Respuesta
Usaría las capacidades de tiempo de Internet integradas de Windows. Puede configurar un time server en su servidor, obtener tiempo de un servidor de segundo nivel y hacer que todas las máquinas de sus clientes obtengan tiempo.
He estado antes en la ruta de configuración de aplicaciones-tiempo.
Ésta es la llamada a la API de Win32 para establecer la hora del sistema:
[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);
No estoy exactamente seguro de lo que se obtendría la seguridad funcionó de tal manera que sea posible ejecutar esa función en el cliente, sin embargo.
Puede obtener muchos más detalles sobre la configuración de la hora del sistema en PInvoke.
+1, por cierto, encontré este enlace con un código fuente completo. http://www.pcreview.co.uk/forums/thread-2085327.php –
No tengo idea por qué, pero esto me dio +2 horas después de cada serie. Así que el tiempo de configuración 2011.04.23 7:20 ... resultó 2011.04.23 9:20 en su lugar. Extraño, pero cuando intento: 2001.03.05 01:55, funcionó bien. –
¿Cómo establece esto el tiempo en una máquina remota? –
La forma de consultar una máquina de red para conocer la hora del sistema es NetRemoteTOD.
Aquí está el código para hacerlo en Delphi (un ejemplo de uso se publica a continuación).
Como depende de las llamadas a la API de Windows, no debería ser demasiado diferente en C#.
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;
Y aquí es el ejemplo de uso:
procedure TfrmMain.SynchLocalTimeWithServer;
var
tod : TTimeHandler;
begin
tod := TTimeHandler.Create(cboServerName.Text);
try
tod.SetLocalSystemTime(tod.RemoteSystemTime);
finally
FreeAndNil(tod);
end; //try-finally
end;
Tengo curiosidad por qué esto fue downvoted. – JosephStyons
Supongo que esto fue downvoted porque la pregunta se hace con la etiqueta C#, pero usted respondió con ejemplos de Delphi/Pascal – evilone
Usted también podría probablemente hacer esto en un archivo por lotes utilizando una combinación de
TIME
para ajustar la hora, y
net time \\server_name
para recuperar el tiempo desde un servidor.
Esta es la rutina que he estado usando durante años para leer el valor DateTime
de nuestro nuestro Servidor SQL (usando la hora del archivo), convertirlo a un SYSTEMTIME
que está configurado en la PC.
Esto funciona para PC y dispositivos con Windows Mobile.
Se puede llamar cada vez que llame a su servidor SQL.
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. Dojo RadioButton, configure un grupo programáticamente
- 2. Eliminando objetos HtmlElement programáticamente usando C#
- 3. ¿Crear un libro Kindle programáticamente usando C#?
- 4. obtiene la hora actual en milisegundos usando C++ y Boost
- 5. Obteniendo la hora actual en C usando time.h
- 6. Configuración de la hora programáticamente en Windows 7
- 7. ¿Cómo mostrar la hora actualizada como hora del sistema en una etiqueta usando C#?
- 8. ¿Cómo convertir programáticamente una hora de una zona horaria a otra en C?
- 9. Obtener la hora actual en C
- 10. Lectura de Openoffice Calc (.ods) programáticamente usando C#?
- 11. C# Hora GMT equivalente con hora UTC?
- 12. instalar/desinstalar un controlador .inf programáticamente usando C# .net
- 13. Convertir cadena a fecha y hora usando C#
- 14. Linux configure/make, --prefix?
- 15. Abrir el control DateTimePicker C# programáticamente
- 16. Agrupar por hora usando LINQ
- 17. ¿Cómo configurar horas por hora en nsdate programáticamente?
- 18. C++ fecha y hora
- 19. Buscar la carpeta windows programáticamente en C#
- 20. C# - Formateo de la hora actual
- 21. configure no reconoce androideabi
- 22. añadiendo comillas alrededor de la fecha y la hora, C#
- 23. Cómo inserto la hora actual en un archivo usando vim
- 24. Eclipse RCP AspectJ configure
- 25. ¿Cómo puedo bloquear la pantalla usando C#?
- 26. Agregar metaetiqueta programáticamente en C#
- 27. Cómo abrir programáticamente Ejecutar C++?
- 28. C# realizar un TNSPing programáticamente
- 29. Configurando programáticamente la configuración del Centro de confianza de MS-Word usando C#
- 30. Usando strftime en C, ¿cómo puedo formatear la hora exactamente como una marca de tiempo Unix?
Voy a apoyar esto. El protocolo de tiempo es un dolor en el trasero para hacerlo bien. Use el servicio integrado si es posible. –