在C#中修改代理服务器设置

时间:2011-02-03 10:25:37

标签: c# .net proxy

我在这里有以下代码片段,我试图构建以自动更改代理设置:

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;
}

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

由于某种原因,虽然代理设置不是,我会像这样调用函数:

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

我的应用程序是一项Windows服务,并且在具有完全权限的本地系统帐户的授权下运行。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

原因是您要更改CURRENT_USER的注册表分支,因此实际上有两个不同的分支-您自己的用户和本地系统。当您以Windows服务运行时,您将更改另一个分支。因此,实际上,您为完全不同的用户设置了值bot。 因此,您需要的-获取用户的SID,然后将其保存在某个位置,以便您的服务可以使用它,并访问正确的分支(该分支属于您的用户)。下面的代码在Windows 10上进行了测试。

public static RegistryKey? GetCurrentUserKey()
{
    var sidString = GetSidFromLocalMachine();
    if (string.IsNullOrWhiteSpace(sidString))
    {
        sidString = WindowsIdentity.GetCurrent().User?.ToString();
    }

    if (string.IsNullOrWhiteSpace(sidString))
        return null;
    
    RegistryKey resultKey = Registry.Users.OpenSubKey(sidString + "\\", true);
    return resultKey;
}

public static string GetSidFromLocalMachine()
{
    var settingsKey = Registry.LocalMachine.OpenSubKey(regKeyInternetSettings, true);
    if (settingsKey != null)
        return settingsKey.GetValue(regSid).ToString();

    return string.Empty;
}

public static bool SaveSidToLocalMachine(string sid)
{
    if (string.IsNullOrWhiteSpace(sid))
        return false;

    var settingsKey = Registry.LocalMachine.OpenSubKey(regKeyInternetSettings, true);
    if (settingsKey == null)
        return false;

    settingsKey.SetValue("SID", sid);
    settingsKey.Close();

    return true;
}

您需要在运行服务之前调用SaveSidToLocalMachine或手动进行设置。然后,只要您需要从服务中加载任何注册表项,只需致电

var key = GetCurrentUserKey()?.OpenSubKey(regKeyInternetSettings, true);
key.SetValue("ProxyEnable", 1);
key.Close();

别忘了刷新:

InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);