Как я могу проверить настройки блокировки 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
, а не числовой, как эта ссылка описывает для одного из них.