2

我有一个 Windows 窗体,需要能够检查 Windows 屏幕保护程序设置(它是否处于活动状态,是否在 15 分钟内,是否“恢复时,显示登录”处于活动状态)基本上如果所有这些都是真的,用户会得到一个很好的如果不是,则大 PASS 用户在文本框中获得大失败。我在网上看了看,没有发现任何东西可以做到这一点。我在想我会通过 Windows 注册表检查设置,因为无论如何我都必须对其他系统设置执行这种方法。

(我曾经使用 BAT 来完成此操作,我将在下面发布上下文,但我需要与 vista 和 up 兼容的东西,以用户友好的方式显示结果)

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"
4

2 回答 2

1

添加到您的代码页: 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,而不是数字,因为此链接针对其中一个进行了描述。

于 2015-04-29T19:44:08.853 回答
1

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

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";
于 2015-04-29T19:44:19.230 回答