在C#中列出并删除注册表子项

时间:2014-01-31 23:24:11

标签: c# listbox registrykey

我是c#的新手并寻求帮助。

我正在使用Windows GPO功能分发软件包。有时特定客户端需要重新安装软件包,但遗憾的是,默认GPO编辑器无法对其进行控制。您可以启动软件包的重新部署,但它将再次在所有客户端上重新安装。

安装状态保存在客户端注册表中。每个软件包在此位置都有一个子键:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\AppMgmt

要在列表中收集远程计算机的子键,请执行以下操作:

List<string> RegFolders = new List<string>();
string subKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\AppMgmt";
RegistryKey AppMgmtKey;
RegistryKey AppKey;

AppMgmtKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, remoteHost).OpenSubKey(subKey);

foreach (string subKeyName in AppMgmtKey.GetSubKeyNames())
                {
                    RegFolders.Add(String.Join(",", subKeyName));
                }

我要将找到的值添加到checked-listbox。由于子键被命名为唯一ID,因此我将获得包含产品描述的每个子键的字符串值:

foreach (string DeplApp in RegFolders)
{
    AppKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, remoteHost).OpenSubKey(GlobalVars.subKey + "\\" + DeplApp);
    string DispName = (string)AppKey.GetValue("Deployment Name");
    cListBoxSubKeys.Items.Add(DispName);
}

到目前为止,产品名称列在了列表框中。我遇到的问题是尝试删除选中的产品时的下一步:

foreach (object itemChecked in cListBoxSubKeys.CheckedItems)
{
    Registry.LocalMachine.DeleteSubKey(subKey + "\\" + itemChecked);
}

如果我将子键的唯一ID添加到checked-listbox,则此方法有效。但是当我添加产品名称时,这当然不起作用。是否有一种简单的方法可以删除整个子密钥而无需在已检查列表框中列出ID?

感谢任何输入!

1 个答案:

答案 0 :(得分:0)

您可以将任何对象添加到选中的列表框,并指定要显示的类的属性:

cListBoxSubKeys.Items.Add(new { Name = DispName, ID = UniqueId });
cListBoxSubKeys.DisplayMember = "Name";
cListBoxSubKeys.ValueMember = "ID";

然后在另一个事件中,读回id:

foreach (object itemChecked in cListBoxSubKeys.CheckedItems)
{
    var uniqueId = itemChecked.GetType().GetProperty("ID").GetValue(itemChecked, null);

    Registry.LocalMachine.DeleteSubKey(subKey + "\\" + uniqueId);
}