Son günlerde aldığım bir ödev sonrasında saç baş yolduracak saatler yaşadım. Windows üzerinde sistemin yüklenme tarihini C/C++ dillerini kullanarak çekmem ve ekrana basmam gerekiyordu. Bunun birden çok yöntemi var fakat hiç kimse kod üzerinden yapılması gerekenleri anlatmamış veya bilmiyor. İnternette bulduğum basit çözümü şöyle göstereyim:
systeminfo|find /i "original"
Yukarıdaki komut, cmd ekranında size istenen sonucu veriyor. ‘systeminfo’ programı içerisinde birçok bilgiyi barındırıyor ve yeri geldiğinde bu bilgilerle kodlama yapmak işinize yarayabilir. Bunları kullanabilmek için ise Win32 API kullanmanız gerekebilir. Bazı veriler için fonksiyonlar api içerisinde yer alırken bazılarına ise farklı yöntemlerle erişmeniz gerekiyor.
Birinci yöntem: Kayıt Defteri Düzenleyicisi
İşte tam burada “system installation date” verisini alabilmem için birazcık api dışına çıkmam gerekiyor. Bunun en zor yöntemi kayıt defteri düzenleyicisi (regedit) kullanmak. Regedit içerisinde “Software\Microsoft\Windows NT\Current Version” dizini altında istediğimiz veri yatmakta. Bunun nasıl çekileceği ise, Win API registry fonksiyonları altında bulunan “RegOpenKeyEx” ve “RegQueryValueEx” fonksiyonlarını incelemek gerekiyor. Bu birinci yöntem ve uzun olacağını düşündüğüm için hiç bakmadım.
İkinci yöntem: Sistem yüklenme tarihiyle eş bir dosya bulmak
İkinci yöntem birinci yönteme göre daha basit. Mantıken Windows dizini içerisinde, sistemin yüklenme tarihiyle aynı tarihe sahip bir dosya bulunması gerekir. Bunu araştırdım ve tam da bu iş için oluşturulmuş bir dosya buldum! “C://Windows//Setup//State” dizini içerisinde State.ini isimli bir dosya, sistemin kurulumunun tamamlandığı bilgisini içeriyor ve sadece bu bilgiyi içermesi için oluşturulmuş. Bu dosyanın oluşturulma tarihi ile komut satırından çekeceğiniz sistemin oluşturulma tarihi saniyesine kadar aynı.
Win API aracılığıyla bu dosyanın oluşturulma tarihini okuduğumuz an sistemin yüklenme tarihini de elde etmiş oluyoruz. Gayet kolay çünkü dosya niteliklerini okumak, bir register sorgusu yazmaktan daha kolay. 🙂
#include <iostream>
#include <Windows.h>
#include <tchar.h>
#include <strsafe.h>
#define UNLEN 255
#define INFO_BUFFER_SIZE 255
BOOL GetLastWriteTime(HANDLE hFile, LPTSTR lpszString, DWORD dwSize)
{
FILETIME ftCreate, ftAccess, ftWrite;
SYSTEMTIME stUTC, stLocal;
DWORD dwRet;
if (!GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))
return FALSE;
FileTimeToSystemTime(&ftWrite, &stUTC);
SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
dwRet = StringCchPrintf(lpszString, dwSize,
TEXT("%02d/%02d/%d %02d:%02d"),
stLocal.wMonth, stLocal.wDay, stLocal.wYear,
stLocal.wHour, stLocal.wMinute);
if (S_OK == dwRet)
return TRUE;
else return FALSE;
}
int main(int argc, TCHAR *argv[])
{
WCHAR userName[UNLEN + 1];
TCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1];
WCHAR processorCoreCount[4];
DWORD computerNameBuffer = INFO_BUFFER_SIZE;
DWORD userNameBuffer = UNLEN + 1;
GetComputerName(computerName, &computerNameBuffer);
printf("Computer Name: %S \n", computerName);
GetUserName(userName, &userNameBuffer);
printf("User Name: %S \n", userName);
SYSTEM_INFO systemInfo;
GetSystemInfo(&systemInfo);
swprintf_s(
processorCoreCount,
4,
L"%d",
systemInfo.dwNumberOfProcessors // get number of processors and set it to processorCoreCount variable
);
std::cout << "Number of Processors: "<<systemInfo.dwNumberOfProcessors<<std::endl;
argv[1] = L"C://Windows//Setup//State//State.ini";
HANDLE hFile;
TCHAR szBuf[MAX_PATH];
/*if (argc != 2)
{
printf("This sample takes a file name as a parameter\n");
return 0;
}*/
hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("CreateFile failed with %d\n", GetLastError());
return 0;
}
if (GetLastWriteTime(hFile, szBuf, MAX_PATH))
_tprintf(TEXT("OS Installation Date: %s\n"), szBuf);
CloseHandle(hFile);
system("pause");
}