2017-08-01 3 views
3

Je modifie le registre de mon ordinateur WIN7 via C#, mais cela ne marche pas. enter image description here mon code aime ci-dessous:Comment puis-je modifier le registre via C# sur win7?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Win32;   //添加针对操作注册表的应用 

namespace operateToolWPF.Utils 
{ 
class RegisterHelper 
{ 
    public static string GetRegistryData(RegistryKey root, string subKey, 
string name) 
    { 
     string registData = string.Empty; 
     RegistryKey myKey = root.OpenSubKey(subKey, true); 
     if (myKey != null) 
     { 
      registData = myKey.GetValue(name).ToString(); 
     } 
     return registData; 
    } 
    /// <summary> 
    /// 向注册表中写数据 
    /// </summary> 
    /// <param name="root"></param> 
    /// <param name="subKey"></param> 
    /// <param name="keyName"></param> 
    /// <param name="keyValue"></param> 
    public static void SetRegistryData(RegistryKey root, string subKey, string keyName, Int32 keyValue) 
    { 
     RegistryKey aimDir = root.CreateSubKey(subKey); 
     aimDir.SetValue(keyName, keyValue, RegistryValueKind.DWord); 
    } 
    /// <summary> 
    /// 删除注册表中指定的注册项 
    /// </summary> 
    /// <param name="root"></param> 
    /// <param name="subKey"></param> 
    /// <param name="keyName"></param> 
    public static void DeleteRegist(RegistryKey root, string subKey, string keyName) 
    { 
     string[] subkeyNames; 
     RegistryKey myKey = root.OpenSubKey(subKey, true); 
     subkeyNames = myKey.GetSubKeyNames(); 
     foreach (string aimKey in subkeyNames) 
     { 
      if (aimKey == keyName) 
       myKey.DeleteSubKeyTree(keyName); 
     } 
    } 
    /// <summary> 
    /// 判断指定注册表项是否存在 
    /// </summary> 
    /// <param name="root"></param> 
    /// <param name="subKey"></param> 
    /// <param name="keyName"></param> 
    /// <returns></returns> 
    public static bool IsRegistryExits(RegistryKey root, string subKey, string keyName) 
    { 
     bool result = false; 
     string[] subKeyNames; 
     RegistryKey myKey = root.OpenSubKey(subKey, true); 
     subKeyNames = myKey.GetValueNames(); 
     foreach (string name in subKeyNames) 
     { 
      if (name == keyName) 
      { 
       result = true; 
       return result; 
      } 
     } 
     return result; 
    } 
} 

}

puis l'appeler comme ceci:

//获取当前Windows用户 
     WindowsIdentity curUser = WindowsIdentity.GetCurrent(); 
     //用户SID 
     SecurityIdentifier sid = curUser.User; 
     //用户全称 
     NTAccount ntacc = (NTAccount)sid.Translate(typeof(NTAccount)); 
     Console.WriteLine("Windows SID:" + sid.Value); 
     Console.WriteLine("用户全称:" + ntacc.Value); 
     Int32 tempInt = 0; //预先定义一个有符号32位数 
     //unchecked语句块内的转换,不做溢出检查 
     unchecked 
     { 
      tempInt = Convert.ToInt32("00000000", 16); //强制转换成有符号32位数 
     } 
     //读取Display Inline Images 
     string displayImgPath = sid.Value + @"\Software\Microsoft\Windows\CurrentVersion\Internet Settings"; 
     string ProxyEnable = RegisterHelper.GetRegistryData(Registry.Users, displayImgPath, "ProxyEnable"); 
     //此时的tempInt已经是有符号32位数,可以直接写入注册表 
     RegisterHelper.SetRegistryData(Registry.Users, displayImgPath, "ProxyEnable", tempInt); 
     Thread.Sleep(3000); 
     RegisterHelper.DeleteRegist(Registry.Users, displayImgPath, "ProxyServer"); 
     RegisterHelper.DeleteRegist(Registry.Users, displayImgPath, "ProxyOverride"); 
     Registry.Users.Close(); 
     Process[] MyProcess = Process.GetProcessesByName("explorer"); 
     MyProcess[0].Kill(); 

par tout cela, je veux modifier ProxyEnable et supprimer ProxyOverride, ProxyServer, qui était annuler le paramètre proxy IE.

J'ai essayé plusieurs méthodes, mais personne ne peut annuler le réglage du proxy IE. Pouvez-vous m'aider? Merci!

Répondre

0

Voici un exemple de la façon dont j'implémenterais les E/S du registre comme vous avez essayé de le faire. Selon la partie du registre que vous essayez de lecture/écriture de peuvent utiliser des clés différentes:

public class MyReg{ 
    public RegistryKey Foriegnkey { 
     get => forignKey; 
     set => forignKey = value; 
    } 
    private RegistryKey forignKey; 

    public object Read(string Path, string Name) => (Registry.CurrentUser.OpenSubKey(Path, false).GetValue(Name)); 

    public void Write(string Path, string Name, object Data) { 
     Foriegnkey = Registry.CurrentUser.CreateSubKey(Path, RegistryKeyPermissionCheck.Default); 
     Foriegnkey.SetValue(Name, Data); 
     Foriegnkey.Close(); 
    } 
    } 

L'exemple ci-dessus en lecture/écriture au niveau actuel de l'utilisateur, mais il y a d'autres niveaux qui peuvent être utilisés, et vous verrez ces options disponibles dans IntelliSense

vous pouvez l'utiliser dans votre application en attribuant une instance de votre classe de registre à un objet et simplement appeler registry.read/write etc ...

cela peut être vérifié nulls utilisant:

if (Registry.GetValue(@"HKEY_CURRENT_USER\Software\MyApp", "SomeValue", null) == null) 

Et quand vous venez d'écrire des données, vous pouvez utiliser:

myregobject.Write(@"\software\MyApp", "SomeValue", "hello world!"); 

Dans votre cas, cela vous permet de faire ce qui suit:

if (!Registry.GetValue(@"\Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", null) == null) { 
     myregobject.Write(@"\Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", "your data here") 
    } 

Je ne peux pas dire si votre méthode de suppression fonctionne ou pas de le regarder, donc je vais jeter dans mon entrée là aussi:

public void RemoveKey(string FolderName) { 
     Registry.CurrentUser.DeleteSubKeyTree(FolderName); 
    } 

Espérons que cela aide!

+0

Merci pour votre aide! Mais ot ne fonctionne pas, et trow exception: System.ArgumentException: 注册表 项 名称 以 以 基 基??.? –

+0

Pouvez-vous fournir plus d'informations sur ce que vous voulez exactement faire? pas à pas. Je peux ajouter un autre exemple de code basé sur ceci pour m'assurer que le code fonctionne pour vous :) – jasttim

+0

J'ai développé une application WPF qui utilise l'API fiddlercore fournie par l'outil proxy Fiddler pour capturer des données de requête HTTP. Enfin, en utilisant la méthode Doquit() fournie par l'API fiddlercore, l'agent est fermé, bien que l'agent soit fermé, mais C# est utilisé pour faire la demande de publication à ce stade, et Internet ne peut pas être connecté. Alors maintenant, je veux utiliser le code pour forcer les champs EnableProxy dans le registre à modifier. –