我有一个 .NET c# 服务在 Windows10 64 位上作为 LocalSystem 运行。它的工作是更改位于下的“ProxyEnable”和“ProxyServer”值
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
在注册表中。它对系统的所有“人类”用户(即以“S-1-5-21..”开头的密钥)执行此操作。它工作正常,用户启动的所有浏览器都使用此配置(代理或无代理)。
但是,仍在运行的浏览器直到很长时间才会注意到更改(打开或关闭代理设置) - 或者直到我手动打开和关闭 Windows“Internet 选项 > 代理设置”(不进行更改或保存它们) 或重新启动浏览器。后两者使系统重新读取并将设置传播到所有(其他)打开的浏览器。
现在 DllImport'ing wininet.dll 并使用 InternetSetOption 确实有效
[DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetSetOption(
IntPtr hInternet,
int dwOption,
IntPtr lpBuffer,
int lpdwBufferLength);
private const int INTERNET_OPTION_PROXY_SETTINGS_CHANGED = 95;
private const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
private const int INTERNET_OPTION_REFRESH = 37;
...
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY_SETTINGS_CHANGED, IntPtr.Zero, 0);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
但只有当我以登录用户身份执行这段代码时。当服务执行它时,它什么也不做。我想这是因为作为 LocalSystem 服务将其应用于错误的范围。
我已经修补了很多。尝试以用户身份启动另一个进程是没有选择的,因为这需要凭据。还设置了使用 LocalSystem 的服务。
我只是相信,作为在权限方面接近管理员的 LocalSystem,必须有一种方法可以告诉所有应用程序和浏览器代理设置已更改。它只是像打开和关闭代理设置-GUI 调用这样的传播,我需要以某种方式触发。但我不知道怎么做。你?