2011-02-03 67 views
1

,我有以下这里的代码片段,即时通讯试图建立自动更改代理服务器设置:修改代理设置

public class ProxyManager 
{ 
    public static bool UnsetProxy() 
    { 
     return SetProxy(null); 
    } 

    public static bool SetProxy(string Ip,int Port) 
    { 
     return SetProxy(Ip + ":" + Port.ToString()); 
    } 

    public static bool SetProxy(string ProxyAddress) 
    { 
     RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); 
     if (ProxyAddress == null) 
     { 
      registry.SetValue("ProxyEnable", 0); 
     } 
     else 
     { 
      registry.SetValue("ProxyEnable", 1); 
      registry.SetValue("ProxyServer", ProxyAddress.ToString()); 
     } 

     //Force the update! 
     registry.Clase(); 
     InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); 
     InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); 
     return true; 
    } 

    [DllImport("wininet.dll")] 
    public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength); 
    public const int INTERNET_OPTION_SETTINGS_CHANGED = 39; 
    public const int INTERNET_OPTION_REFRESH = 37; 
} 

但由于某些原因的代理服务器设置没有被设置的,我知道方法正在被正确执行,因为我在调用该方法后将事件插入到事件管理器中,并且该方法是可见的。

出于某种原因,尽管代理设置都没有,I'me调用像这样的功能:

EventManager.WriteEntry("Proxy Settings Enabled"); 
ProxyManager.SetProxy("10.222.62.65:8080"); 

我的应用程序是一个Windows服务和本地系统账户的授权下所运行的拥有完整的权限。

回答

1

我怀疑它可能是您使用代码Registry.CurrentUser并且它在Local System Account下运行的事实的组合。

您的问题的这两个片段的组合使我认为你可能会更改错误的用户帐户的设置?我建议尝试在您的帐户下运行该服务,看看是否有任何区别(假设这可能是由于UAC等原因)。

+0

@罗伯特:有了'标准用户',你的意思是你自己的账户?你如何检查设置是否被改变? – 2011-02-03 13:11:28

+0

在多个帐户下运行服务后,断开以太网电缆,等到我在事件查看器中看到消息,说明代理已更改,然后直接检查注册表和IE代理设置,并查看没有更改。 – RobertPitt 2011-02-07 15:51:46

0

我写了一个类似的程序来禁用网络适配器和更改代理。它位于tognet.codeplex.com。我遇到过//强制更新代码不知道如何刷新Windows 7盒子上的代理设置。如果我重新启动IE并再次查看代理设置,那么它将显示代理的正确状态。