.NETを使用して、最後のWindowsシャットダウンイベントの日時を取得する
質問
システムが最後にシャットダウンされた日時を知る方法はありますか?
WMI を使用して Win32_OperatingSystem 名前空間の LastBootUpTime プロパティを使用して、最後の起動時間を見つける方法があることを知っています。
最後のシャットダウン時間を見つけることに似たものはありますか?
ありがとう。
解決
(ここにあるものはすべて JDunkerleyの以前の回答)
ソリューションは上記ですが、 byte
配列から DateTime
に移行するアプローチは、 BitConverter
を使用してより少ないステートメントで実現できます。次の6行のコードは同じことを行い、レジストリから正しい DateTime
を提供します。
public static DateTime GetLastSystemShutdown()
{
string sKey = @"System\CurrentControlSet\Control\Windows";
Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sKey);
string sValueName = "ShutdownTime";
byte[] val = (byte[]) key.GetValue(sValueName);
long valueAsLong = BitConverter.ToInt64(val, 0);
return DateTime.FromFileTime(valueAsLong);
}
他のヒント
Windowsがスムーズにシャットダウンすると仮定します。レジストリに保存します:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ShutdownTime
バイトの配列として保存されますが、FILETIMEです。
より良い方法があるかもしれませんが、私はこれを以前に使用し、それが機能すると考えています:
public static DateTime GetLastSystemShutdown()
{
string sKey = @"System\CurrentControlSet\Control\Windows";
Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sKey);
string sValueName = "ShutdownTime";
object val = key.GetValue(sValueName);
DateTime output = DateTime.MinValue;
if (val is byte[] && ((byte[])val).Length == 8)
{
byte[] bytes = (byte[])val;
System.Runtime.InteropServices.ComTypes.FILETIME ft = new System.Runtime.InteropServices.ComTypes.FILETIME();
int valLow = bytes[0] + 256 * (bytes[1] + 256 * (bytes[2] + 256 * bytes[3]));
int valTwo = bytes[4] + 256 * (bytes[5] + 256 * (bytes[6] + 256 * bytes[7]));
ft.dwLowDateTime = valLow;
ft.dwHighDateTime = valTwo;
DateTime UTC = DateTime.FromFileTimeUtc((((long) ft.dwHighDateTime) << 32) + ft.dwLowDateTime);
TimeZoneInfo lcl = TimeZoneInfo.Local;
TimeZoneInfo utc = TimeZoneInfo.Utc;
output = TimeZoneInfo.ConvertTime(UTC, utc, lcl);
}
return output;
}
このコードを使用して、最後の再起動時間を見つけることができます
static void Main(string[] args)
{
TimeSpan t = TimeSpan.FromMilliseconds(System.Environment.TickCount);
Console.WriteLine( DateTime.Now.Subtract(t));
}
所属していません StackOverflow