65.9K
CodeProject 正在变化。 阅读更多。
Home

限制 Windows 中的应用程序执行

2009 年 4 月 23 日

CPOL

3分钟阅读

viewsIcon

30665

downloadIcon

828

如何在 Windows 中锁定某些应用程序,或锁定所有应用程序,除了指定的应用程序。

LockUp_Source

引言

本文的目的是向您展示如何在 Windows XP 中限制某些应用程序的执行并允许其他应用程序。

免责声明

作者不对本文或其任何内容的使用作任何保证,并且对因使用本文任何内容而可能造成的任何数据丢失或其他系统问题不承担任何责任。

背景

我意识到用这样的免责声明开始这篇文章可能会有点尴尬,但是当涉及到摆弄注册表时,你应该小心谨慎。

该应用程序管理一个特定的键,该键允许/禁止在 HKCU 下列出的应用程序的执行,这意味着,所有修改仅应用于当前登录的用户。

Windows 注册表是一个数据库,用于存储 Microsoft Windows 操作系统的设置和选项。它包含硬件、操作系统软件、大多数非操作系统软件以及每个用户设置的信息和设置。注册表还提供了一个窗口,可以了解内核的运行情况,公开运行时信息,例如性能计数器和当前活动的硬件。

由于本文的主要目的是处理注册表中的某些键,因此我将仅讨论相关的代码块。以下初始化了三个主要键

strKeyExplorer = @"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer";
strKeyRestrictRun = 
  @"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\RestrictRun";
strKeyDisallowRun = 
  @"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun";

keyExplorer = Registry.CurrentUser.OpenSubKey(strKeyExplorer, true);
keyRestrictRun = Registry.CurrentUser.CreateSubKey(strKeyRestrictRun, 
                          RegistryKeyPermissionCheck.ReadWriteSubTree);
keyDisallowRun = Registry.CurrentUser.CreateSubKey(strKeyDisallowRun, 
                          RegistryKeyPermissionCheck.ReadWriteSubTree);

存储在 strKeyExplorer 中的第一个键路径用于打开注册表中的 Explorer 键,这是我们为应用程序设置两个主要值的键。建议您打开注册表编辑器并导航到相对的键路径,以注意更改,如下面的快照所示

Reg1.PNG

我们在这篇文章中关注的主要值是

  • DisallowRun(禁止运行)
  • RestrictRun(限制运行)

您可以看到,从 Explorer 分支出来的另外两个键,它们包含这些值在键中的确切名称。这个过程很简单,通过将其设置为 1 来启用 Explorer 键中的任一值,或通过将其设置为 0 来禁用它。

注意:当这两个值都被启用时,DisallowRun 优先控制并覆盖 RestrictRun 的值。

回到从 Explorer 分支出来的两个键,您可以看到应用程序名称只是简单地列在每个键下,因此当它们在 Explorer 下的等效值被启用时,该键下列出的应用程序就会被允许/禁止!

让我们仔细看看并打开 DisallowRun 键,看看它包含什么

Reg2.PNG

使用代码

通过以下函数将应用程序添加到列表中

private void btnAdd_Click(object sender, EventArgs e)
{
    if (txtFileLocation.Text.Length > 0 && File.Exists(txtFileLocation.Text))
    {
        string[] splitted = txtFileLocation.Text.Split('\\');
        string strExists = Convert.ToString(keyRestrictRun.GetValue(
                                   txtFileLocation.Text,"None"));
        if (strExists == "None")
        {
            keyRestrictRun.SetValue(txtFileLocation.Text, splitted[splitted.Length - 1], 
                                    RegistryValueKind.String);
            keyDisallowRun.SetValue(txtFileLocation.Text, splitted[splitted.Length - 1], 
                                    RegistryValueKind.String);

        }
        else
            MessageBox.Show("File already in the list", 
                            "Duplicate application file", 
                            MessageBoxButtons.OK, MessageBoxIcon.Error);
        txtFileLocation.Text = String.Empty;
    }
    else
        MessageBox.Show("Please browse for a valid program file first.", 
                        "Invalid or incomplete file name", 
                        MessageBoxButtons.OK, MessageBoxIcon.Error);

    RefreshList();
    load_image_list();
}

并使用以下方法删除

private void btnRemove_Click(object sender, EventArgs e)
{
    if (listView1.SelectedIndices.Count > 0)
    {
        try
        {
            keyRestrictRun.DeleteValue(
              listView1.Items[listView1.SelectedIndices[0]].SubItems[1].Text);
            keyDisallowRun.DeleteValue(
              listView1.Items[listView1.SelectedIndices[0]].SubItems[1].Text);
            listView1.Items[listView1.SelectedIndices[0]].Remove();
        }
        catch (Exception) { }
    }

    RefreshReg();
    RefreshList();
    load_image_list();
}

最后,在将所需的应用程序添加到键之后,我们需要使用以下代码来设置禁用或启用在这两个键下列出的应用程序

private void RefreshReg()
{
    if (rdOnly.Checked)
    {
        keyExplorer.SetValue("RestrictRun", 0, RegistryValueKind.DWord);
        keyExplorer.SetValue("DisallowRun", 1, RegistryValueKind.DWord);

        try
        {
            keyRestrictRun.DeleteValue(strSrcFile);
        }
        catch (Exception) { }
    }
    else
    {
        keyExplorer.SetValue("RestrictRun", 1, RegistryValueKind.DWord);
        keyRestrictRun.SetValue(strSrcFile, assName, RegistryValueKind.String);

        keyExplorer.SetValue("DisallowRun", 0, RegistryValueKind.DWord);
    }
}

关注点

您可能对该应用程序的视觉效果感兴趣,例如提取列出的应用程序的图标。好吧,这是使用以下方法完成的

private void load_image_list()
{
    imglst_SmallIcons.Images.Clear();
    imglst_LargIcons.Images.Clear();

    string[] strValueNames = keyRestrictRun.GetValueNames();
    string tmp = String.Empty;

    foreach (string s in keyRestrictRun.GetValueNames())
    {
        try
        {
            ExtractIconEx(s, 0, largeIcon, smallIcon, 1);
            imglst_SmallIcons.Images.Add(Icon.FromHandle(smallIcon[0]));
            imglst_LargIcons.Images.Add(Icon.FromHandle(largeIcon[0]));
        }
        catch (Exception)
        {
            ExtractIconEx("shell32.dll", 0, largeIcon, smallIcon, 3);
            imglst_SmallIcons.Images.Add(Icon.FromHandle(smallIcon[2]));
            imglst_LargIcons.Images.Add(Icon.FromHandle(largeIcon[2]));
        }
    }
}

并且,对于移动按钮,您可以简单地将一个图像添加到您的解决方案中,该图像具有两种状态的较大尺寸,并简单地更改您的控件的 PictureBoxSizeMode 属性。

private void btnAdd_MouseEnter(object sender, EventArgs e)
{
    btnAdd.SizeMode = PictureBoxSizeMode.StretchImage;
}

private void btnAdd_MouseLeave(object sender, EventArgs e)
{
    btnAdd.SizeMode = PictureBoxSizeMode.CenterImage;
}

另一个有趣的解决方法是,您可以简单地使用密钥中列出的名称之一来重命名可执行文件!您相信这个技巧会这么愚蠢吗!

一个建议的补救措施(以防万一!)

以防万一您的 Windows 崩溃了,并且由于这些效果仅应用于当前用户,您可以随时创建一个新的用户帐户并保存存储在崩溃帐户中的那些文件,除非您正在激活该帐户上的 NTFS!

© . All rights reserved.