Hi All/Crystal-MSFT/Zafer KAYA ,
We were able to make it work by using the below script
Add-Type @'
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace PInvoke.Win32 {
public static class UserInput {
[DllImport("user32.dll", SetLastError=false)]
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
[StructLayout(LayoutKind.Sequential)]
private struct LASTINPUTINFO {
public uint cbSize;
public int dwTime;
}
public static DateTime LastInput {
get {
DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount);
DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks);
return lastInput;
}
}
public static TimeSpan IdleTime {
get {
return DateTime.UtcNow.Subtract(LastInput);
}
}
public static int LastInputTicks {
get {
LASTINPUTINFO lii = new LASTINPUTINFO();
lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO));
GetLastInputInfo(ref lii);
return lii.dwTime;
}
}
}
}
'@
for ($i = 0; $i -lt 545000; $i++) {
$Last = [PInvoke.Win32.UserInput]::LastInput
$Idle = [PInvoke.Win32.UserInput]::IdleTime
$LastStr = $Last.ToLocalTime().ToString("MM/dd/yyyy hh:mm tt")
Write-Host ("`nTest " + $i)
Write-Host (" Last user keyboard/mouse input: " + $LastStr)
Write-Host (" Idle for " + $Idle.Days + " days, " + $Idle.Hours + " hours, " + $Idle.Minutes + " minutes, " + $Idle.Seconds + " seconds.")
# Check if idle time exceeds 3 hours (10,800 seconds)
if ($Idle.TotalSeconds -gt 10800) {
Write-Host "Idle time exceeded 3 Hours seconds. Initiating shutdown..."
Start-Process -FilePath "shutdown.exe" -ArgumentList "/s /t 900" -NoNewWindow
break
}
# Random sleep to simulate repeated checks
Start-Sleep -Seconds (Get-Random -Minimum 1 -Maximum 900)
}