zoukankan      html  css  js  c++  java
  • c# win7注册表【Registry】 操作

          2009年的在上海参加了win7的产品兼容性问题活动。在win7系统注册表信息的操作就比较麻烦...不像xp系统那样简单,win7安全性比较高点。

    所以,在操作win7注册表是必须要有管理员身份才能操作注册表信息,这样不会被UAC(用户帐户控制)阻止访问操作注册表信息。

          这里讲一 C# 小列子(高手请绕过此地!), 我们平时都是在xp开发比较多...不过现在很多开发人员也在win7下开发了。

         下面是在 LocalMachine下的 一下注册表操作 ,就不详说了

    privatestaticvoid DeleteRegistry(string name)
    {
    string[] aimnames;
    RegistryKey hkml
    = Registry.LocalMachine;
    RegistryKey software
    = hkml.OpenSubKey("SOFTWARE", true);
    RegistryKey aimdir
    = software.OpenSubKey("Microsoftss", true);
    aimnames
    = aimdir.GetSubKeyNames();
    foreach (string aimKey in aimnames)
    {
    if (aimKey == name)
    aimdir.DeleteSubKeyTree(name);
    }
    }

    privatestaticstring GetData(string name)
    {
    string registData;
    RegistryKey hkml
    = Registry.LocalMachine;
    RegistryKey software
    = hkml.OpenSubKey("SOFTWARE", true);
    RegistryKey aimdir
    = software.OpenSubKey("Microsoftss", true);
    registData
    = aimdir.GetValue(name).ToString();
    return registData;
    }

    privatestaticvoid WriteValue(string name, string tovalue)
    {
    RegistryKey hklm
    = Registry.LocalMachine;
    RegistryKey software
    = hklm.OpenSubKey("SOFTWARE", true);
    RegistryKey aimdir
    = software.CreateSubKey("Microsoftss");
    aimdir.SetValue(name, tovalue);
    }

    privatestaticbool IsExit(string name)
    {
    bool _exit =false;
    string[] subkeyNames;
    RegistryKey hkml
    = Registry.LocalMachine;
    RegistryKey software
    = hkml.OpenSubKey("SOFTWARE", true);
    RegistryKey aimdir
    = software.OpenSubKey("Microsoftss", true);
    subkeyNames
    = aimdir.GetValueNames();
    foreach (string keyName in subkeyNames)
    {
    if (keyName == name)
    {
    _exit
    =true;
    return _exit;
    }
    }
    return _exit;
    }

          比如,当我们在xp系统下 软件执行Writevalue("版本号","v1.0.0.1"),一切都ok! 然后乐的就抛给了客户...没有思考。

    一天客户换了win7系统 ,运了软件了。客户拉着42号鞋子的脸说,怎么软件在win7不能运行了....。问题就是上面开头说的了。

    解决方法是有地....

            这里列举几种.

            第一种、教教客户、或者技术服务人员就好了。这个方法不需要修改我们的代码这是好处之一。只要, 点击.exe 右键

    ,在弹出的菜单中选择【属性】, 选择【兼容性】项,并勾选【以管理员身份运行此程序】就ok了。简单吧 

            第二种、也算简单,不过我们就要重新生成软件了。首先、在程序中加入MANIFEST资源,右击工程在菜单->【属性】->【安全性】,在界面中勾选【启用ClickOnce安全设置】,在项目的Properties下就有自动生成app.manifest文件。

            文件内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
    <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
    <!-- UAC 清单选项
    如果希望更改 Windows 用户帐户控制级别,请用以下节点之一替换
    requestedExecutionLevel 节点。

    <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
    <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
    <requestedExecutionLevel level="highestAvailable" uiAccess="false"/>

    如果您希望利用文件和注册表虚拟化提供
    向后兼容性,请删除 requestedExecutionLevel 节点。
    -->
    <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
    </requestedPrivileges>
    <applicationRequestMinimum>
    <defaultAssemblyRequest permissionSetReference="Custom"/>
    <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site"/>
    </applicationRequestMinimum>
    </security>
    </trustInfo>
    </asmv1:assembly>

     把 <requestedExecutionLevel level="asInvoker" uiAccess="false"/> 的 asInvoker 改为"requireAdministrator"。重新编译一下就ok了。

    看到这个了吧!

    这就是UAC(用户帐户控制)了

      <!-- UAC 清单选项
                如果希望更改 Windows 用户帐户控制级别,请用以下节点之一替换 
                requestedExecutionLevel 节点。
    
            <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
            <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
            <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
    
                如果您希望利用文件和注册表虚拟化提供
                向后兼容性,请删除 requestedExecutionLevel 节点。
            -->
    

    还有其他的方法。不过上面两种比较简单...。



    作者:JasonXuVip
    我的网址:政和生活网
    本文地址:
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

  • 相关阅读:
    Delphi公用函数单元
    Delphi XE5 for Android (十一)
    Delphi XE5 for Android (十)
    Delphi XE5 for Android (九)
    Delphi XE5 for Android (八)
    Delphi XE5 for Android (七)
    Delphi XE5 for Android (五)
    Delphi XE5 for Android (四)
    Delphi XE5 for Android (三)
    Delphi XE5 for Android (二)
  • 原文地址:https://www.cnblogs.com/jasonxuvip/p/2085567.html
Copyright © 2011-2022 走看看