检查系统空闲,并在5分钟后将系统置于注销状态(如果没有人使用)

本文关键字:系统 状态 注销 如果没有 没有人 如果 于注销 并在 5分钟 检查 | 更新日期: 2023-09-27 18:00:26

有什么可以提供系统空闲的东西吗?我们希望使用C#来获取系统在所有会话中的空闲时间,并在没有人使用机器X分钟的情况下将机器注销。

对此有什么想法吗。。。。。

检查系统空闲,并在5分钟后将系统置于注销状态(如果没有人使用)

如果您正在运行终端服务器,这可以通过组策略或终端服务配置来完成

服务器2003

服务器2008

服务器2008 R2


要注销桌面会话,您需要有一个在后台运行的程序(这不能作为系统服务运行,它必须作为交互式会话的一部分运行),该程序将使用GetLastInputInfo检查登录时间,然后可以调用ExitWindowsEx注销。

class Program
{
    [StructLayout(LayoutKind.Sequential)]
    struct LASTINPUTINFO
    {
        public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));
        [MarshalAs(UnmanagedType.U4)]
        public int cbSize;
        [MarshalAs(UnmanagedType.U4)]
        public UInt32 dwTime;
    }

    [DllImport("user32.dll")]
    static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool ExitWindowsEx(uint uFlags, uint dwReason);
    static void Main(string[] args)
    {
        bool running = true;
        while (running)
        {
            if (GetLastInputTime() > 60 * 15) //15 min idle time
            {
                ExitWindowsEx(0, 0);
                running = false;
            }
            Thread.Sleep(1000 * 60); //check once per min.
        }
    }
    static int GetLastInputTime()
    {
        int idleTime = 0;
        LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
        lastInputInfo.cbSize = Marshal.SizeOf(lastInputInfo);
        lastInputInfo.dwTime = 0;
        int envTicks = Environment.TickCount;
        if (GetLastInputInfo(ref lastInputInfo))
        {
            int lastInputTick = (int)lastInputInfo.dwTime;
            idleTime = envTicks - lastInputTick;
        }
        return ((idleTime > 0) ? (idleTime / 1000) : 0);
    }
}

我曾经需要这样做,但很难找到消息来源,这可能会帮助其他人,因为他们正在关注这种问题。所以,尽管我在回答,我还是否决了这个问题。

UPDATE:以下是一种将其作为服务运行的技术