проверка простоя системы и перевод системы в состояние выхода через 5 минут (если никто не использует) - PullRequest
0 голосов
/ 27 июня 2011

Есть ли что-нибудь, что обеспечивает бездействие системы? Мы хотим использовать C #, чтобы получить время простоя системы во всех сеансах и вывести машину из системы, если никто не использует машину в течение X минут.

есть идеи об этом .....

1 Ответ

4 голосов
/ 27 июня 2011

Если вы используете сервер терминалов, это можно сделать с помощью групповых политик или конфигурации служб терминалов

Сервер 2003

Сервер 2008

Server 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);
    }

}

Мне нужно было сделать это один рази у него были проблемы с поиском источников, и это может помочь кому-то еще, кто задает вопрос такого рода.Так что, хотя я отвечаю, я не голосую за вопрос.

ОБНОВЛЕНИЕ : Вот метод , чтобы заставить его работать как услуга

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...