如何检查 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";
我有一个 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";