Как я могу проверить настройки блокировки Windows?

У меня есть форма Windows, которая должна быть в состоянии проверить настройки экранной заставки Windows (активна ли она, меньше 15 минут, активна ли "при возобновлении, отображать вход в систему")? По сути, если все из них верны, пользователь получает хороший большой PASS, если нет, пользователь получает большой FAIL в текстовом поле. Я посмотрел онлайн и не нашел ничего, что могло бы сделать это. Я думал, что проверю настройки через реестр Windows, так как в любом случае мне придется использовать этот метод для других системных настроек.

(Я использовал для этого BAT, который я опубликую ниже для контекста, но мне нужно что-то совместимое с Vista и выше, которые отображают результаты в удобной для пользователя форме)

echo The following check is for 15 minute inactive lock
echo if true the setting will be set to 1 of false 0
echo            
echo is the screen saver active
reg query "HKCU\Control Panel\Desktop" /v ScreenSaveActive
echo is the screen saver locking the device
reg query "HKCU\Control Panel\Desktop" /v ScreenSaverIsSecure
echo How long until the screen saver activates (900 or below for compliance) 
reg query "HKCU\Control Panel\Desktop" /v ScreenSaveTimeOut
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\GroupPolicyObjects"

2 ответа

Решение

Похоже, вы пытаетесь прочитать раздел реестра и установить логическое значение на основе значения. Если это так, это должно помочь:

RegistryKey regDesktop = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop");

bool isScreenSaverActive = regDesktop != null && 
    regDesktop.GetValue("ScreenSaveActive").ToString() == "1";

Если параметры, которые вы описали в своем вопросе, являются единственными, которые вы хотите проверить, вот метод, который вернет true, если они существуют и соответствуют вашим ожидаемым значениям (ScreenSaveActive == 1, ScreenSaverIsSecure == 1, and ScreenSaveTimeOut <= 900):

public static bool LockSettingsAreCompliant()
{
    bool lockSettingsAreCompliant = false;

    try
    {
        using (var regKey = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop"))
        {
            lockSettingsAreCompliant =
                regKey.GetValue("ScreenSaveActive").ToString() == "1" &&
                regKey.GetValue("ScreenSaverIsSecure").ToString() == "1" &&
                int.Parse(regKey.GetValue("ScreenSaveTimeOut").ToString()) <= 900;
        }
    }
    catch
    {
        // Swallow exceptions and let the method return false
    }

    return lockSettingsAreCompliant;
}

И затем вы можете использовать этот метод, как показано ниже, чтобы установить текстовое поле:

screenSaver.Text = LockSettingsAreCompliant() ? "PASS" : "FAIL";

Добавьте к своей кодовой странице: using Microsoft.Win32;

Затем используйте этот код для извлечения значений из реестра:

using (var key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop"))
{
    if (key != null)
    {
        Boolean isActive = false;
        Boolean isSecure = false;
        Int32 timeoutSeconds = 0;
        var o = key.GetValue("ScreenSaveActive", "");
        if (!String.IsNullOrWhiteSpace(o as String))
        {
            Int32 i;
            if (Int32.TryParse((String)o, out i))
                isActive = (i == 1);
        }
        o = key.GetValue("ScreenSaverIsSecure", "");
        if (!String.IsNullOrWhiteSpace(o as String))
        {
            Int32 i;
            if (Int32.TryParse((String)o, out i))
                isSecure = (i == 1);
        }
        o = key.GetValue("ScreenSaveTimeOut", "");
        if (!String.IsNullOrWhiteSpace(o as String))
        {
            Int32 i;
            if (Int32.TryParse((String)o, out i))
                timeoutSeconds = i;
        }
    }
}

Как отметил в комментариях Рон Бейер, ScreenSaveActive Один флаг может быть ненадежным. Возможно, вам придется рассмотреть флаги вместе, чтобы получить полную картину.

Обратите внимание, что весь анализ строки происходит из-за того, что значения хранятся как REG_SZ, а не числовой, как эта ссылка описывает для одного из них.

Другие вопросы по тегам