2012-06-01 6 views
9

Así que, simplemente, la cuestión es cómo obtener el tiempo de arranque del sistema en Windows con c/C++.Programado para obtener el tiempo de arranque del sistema en C++ (windows)

Buscando esto no me ha dado ninguna respuesta, solo he encontrado un enfoque realmente hacky que es leer una marca de tiempo de archivo (no hace falta decir que abandoné la lectura a la mitad).

Otro enfoque que encontré fue en realidad la lectura de eventos de registro de diagnósticos de Windows? Supuestamente, eso tiene el último tiempo de arranque.

¿Alguien sabe cómo hacer esto (con suerte no demasiados hacks feos)?

Respuesta

16

GetTickCount64 "recupera el número de milisegundos que han transcurrido desde que se inició el sistema".

Una vez que sepa cuánto tiempo ha estado funcionando el sistema, es simplemente una cuestión de restar esta duración de la hora actual para determinar cuándo se inició. Por ejemplo, el uso de la biblioteca de C++ 11 crono (apoyado por Visual C++ 2012):

auto uptime = std::chrono::milliseconds(GetTickCount64()); 
auto boot_time = std::chrono::system_clock::now() - uptime; 
+0

que había necesidad de combinar eso con 'GetSystemTime' y hacer un poco de matemáticas fecha para una respuesta completa a la pregunta. – Benj

+0

Lo siento si no estaba claro, pero me refiero a la hora real, no hace mucho tiempo. Es decir. : "El sistema arrancó en 2012/06/01 10:00" – Eximius

+0

Benj, supongo que eso funciona ... Gracias. Esto todavía es algo así como un hack:/ – Eximius

6

También puede utilizar WMI para obtener la hora exacta de inicio. WMI no es para los débiles de corazón, pero obtendrá lo que está buscando.

La información en cuestión se encuentra en el objeto Win32_OperatingSystem en la propiedad LastBootUpTime. Puede examinar otras propiedades usando WMI Tools.

WMI Explorer showing property instance

Editar: También puede obtener esta información de la línea de comandos, si lo prefiere.

wmic OS Get LastBootUpTime 

A modo de ejemplo en C# que se vería como la siguiente (Using C++ it is rather verbose):

static void Main(string[] args) 
{  
    // Create a query for OS objects 
    SelectQuery query = new SelectQuery("Win32_OperatingSystem", "Status=\"OK\""); 

    // Initialize an object searcher with this query 
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 

    string dtString; 
    // Get the resulting collection and loop through it 
    foreach (ManagementObject envVar in searcher.Get()) 
     dtString = envVar["LastBootUpTime"].ToString(); 
} 
+0

¿Es posible obtener el último "Tipo de arranque" (Significa arrancar desde el apagado o Hibernar)? – RDX

+0

La línea de comando 'wmic OS Get LastBootUpTime' parece devolver la PRIMERA vez que se inició la PC ... ' wmic LOGON Get StartTime' puede ser más útil –

Cuestiones relacionadas