首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

好几没来了.有来,关于操作注册表

2013-10-15 
好几没来了.有来求助,关于操作注册表.先上代码:public partial class MainForm: Form {private Liststrin

好几没来了.有来求助,关于操作注册表.
先上代码:

public partial class MainForm: Form {
        private List<string> _DeleteResult = new List<string>();    //存储删除列表.
        public MainForm() {
            InitializeComponent();
            labSearch.Click += (s, e) => { txtSearch.Focus(); };
        }

        private void Form1_Load(object sender, EventArgs e) {
            combox_path.SelectedIndex = 0;  //默认选第一项.
        }

        void RecursiveRegedit(RegistryKey regBoot) {
            if(regBoot == null) throw new ArgumentNullException("项为空!");
            string[] vals = regBoot.GetValueNames();
            foreach(var v in vals) {
                string s = regBoot.GetValue(v).ToString();
                //以路径开头(不区分大小写)并匹配待查找字符串(不区分大小写).
                if(s.StartsWith(combox_path.Text.Trim(), StringComparison.CurrentCultureIgnoreCase) && s.ToLower().Contains(txtSearch.Text.ToLower().Trim())) {
                    _DeleteResult.Add(v + "->" + s);    //添加键值.
                    regBoot.DeleteValue(v, false);
                }
            }
            if(regBoot.SubKeyCount <= 0)
                return; //递归出口.
            else {
                string[] subs = regBoot.GetSubKeyNames();
                foreach(string s in subs) {
                    RecursiveRegedit(regBoot.OpenSubKey(s, true));
                }
            }
            regBoot.Close();    //关闭.
        }

        private void btn_Click(object sender, EventArgs e) {
            if(MessageBox.Show("确定要删除?", "删除注册表", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning) != DialogResult.Yes)
                return;
            if(!chebox_current_user.Checked && !chebox_local_machine.Checked) {
                MessageBox.Show("请选择"删除选项"!");
                return;
            }
            if(chebox_hasESRI.Checked) {    //有ESRI项时仅扫描ESRI.
                if(chebox_current_user.Checked)
                    RecursiveRegedit(Registry.CurrentUser.OpenSubKey("SOFTWARE").OpenSubKey("ESRI", true));
                if(chebox_local_machine.Checked)
                    RecursiveRegedit(Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("ESRI", true));
            }
            else {
                if(chebox_current_user.Checked) //无ESRI项时扫描Software下所有.
                    RecursiveRegedit(Registry.CurrentUser.OpenSubKey("SOFTWARE", true));


                if(chebox_local_machine.Checked)
                    RecursiveRegedit(Registry.LocalMachine.OpenSubKey("SOFTWARE", true));
            }

            MessageBox.Show("Done!共删除\t" + _DeleteResult.Count + "\t个");
            foreach(var item in _DeleteResult) {
                lbox.Items.Add(item);
            }
        }
    }



运行界面:
好几没来了.有来,关于操作注册表
说明:
原本是先删除 Software下的 ESRI,但是有时用户删除了这个项,所以就想全部扫描 Software,但是有的是没有权限的,怎么办?
RegistrySecurity怎么用?我用的时候又报新的错,说是非法的操作.....
关于算法是,值包含"查找字符串"且前面为指定的路径.
这个就是兼容模式,win7确实麻烦多,但是还是仔细检查下代码
[解决办法]
楼主也做ArcGIS啊,

试试这个吧, 添加到 AssemblyInfo 里,
以前我是这么做的, 但不能在各种机子,各种系统上测试.


[assembly: RegistryPermissionAttribute(SecurityAction.RequestMinimum, ViewAndModify = @"HKEY_CURRENT_USER\Software;HKEY_LOCAL_MACHINE\Software;HKEY_USERS")]

[解决办法]
引用:
Quote: 引用:

楼主也做ArcGIS啊,

试试这个吧, 添加到 AssemblyInfo 里,
以前我是这么做的, 但不能在各种机子,各种系统上测试.


[assembly: RegistryPermissionAttribute(SecurityAction.RequestMinimum, ViewAndModify = @"HKEY_CURRENT_USER\Software;HKEY_LOCAL_MACHINE\Software;HKEY_USERS")]

我在 xp 中运行,还是一样报错...


那我也木有办法了 -_-#
[解决办法]
注册表里 不是所有的项 都具有权限去读写的 
注册表的项 就像文件夹一样有权限设置的  即使你是系统管理员 有的项 也要手动修改权限后才能操作
遍历到无权限的项 会出错 try cath 跳过该项 就好

热点排行