如何检查 Windows 锁定设置?

How can I check Windows Lock settings?

我有一个 windows 表单需要能够检查 windows 屏幕保护程序设置(它是否处于活动状态,它是否在 15 分钟内,是否 "on resume, display logon" 处于活动状态)本质上如果所有这些都是真的,则用户将获得一个很好的大通过,否则用户将在文本框中获得一个大失败。我在网上看过,但没有找到任何可以实现这一点的东西。我想我会通过 windows 注册表检查设置,因为无论如何我都必须对其他系统设置执行此方法。

(我曾经使用 BAT 来完成此操作,我将在下面 post 作为上下文,但我需要与 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"

添加到您的代码页: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;
        }
    }
}

正如 Ron Beyer 在评论中指出的那样,ScreenSaveActive 标志本身可能并不可靠。可能您必须将这些标志一起考虑才能获得完整的图片。

请注意,所有字符串解析都是由于值存储为 REG_SZ,而不是数字,如 this link 对其中之一的描述。

听起来您正在尝试读取注册表项并根据该值设置布尔值。如果是这样,这应该有所帮助:

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

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

如果您在问题中描述的设置是您想要检查的唯一设置,那么这里有一个方法 return 如果它们存在并且符合您的预期值 (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";