使用 Python 以编程方式检测 Windows XP 上的系统代理设置

Sal*_*ley 5 python windows proxy networking setuptools

我开发了一家跨国公司使用的关键应用程序。全球各地办公室的用户都需要能够安装此应用程序。

该应用程序实际上是 Excel 的一个插件,我们有一个基于 Setuptools 的 easy_install 的自动安装程序,可确保用户每次打开 Excel 时自动安装或更新项目的所有依赖项。这一切都运行得非常优雅,因为用户很少意识到所有安装完全在后台进行。

不幸的是,我们正在扩大和开设新的办事处,这些办事处都有不同的代理设置。这些设置似乎每天都在变化,因此我们无法跟上那些在不告诉我们的情况下更改内容的外包安全人员。这很糟糕,但我们必须解决它。

我想以编程方式检测用户运行的 Windows 工作站上的系统范围代理设置:

组织中的每个人都运行 Windows XP 和 Internet Explorer。我已经证实,每个人都可以毫无问题地从 IE 下载我们的东西,无论他们在世界的哪个地方。

因此,我需要做的就是检测 IE 正在使用哪些代理设置,并让安装工具使用这些设置。理论上所有这些信息都应该在注册表中..但是有没有更好的方法来找到它并保证不会随着人们升级 IE 而改变?例如,我可以使用 Windows API 调用来发现代理设置吗?

总之:

  • 我们在 Windows XP 上使用 Python 2.4.4
  • 我们需要检测 Internet Explorer 代理设置(例如主机、端口和代理类型)
  • 我将使用此信息动态地重新配置 easy_install,以便它可以通过代理下载 Egg 文件。

更新0:

我忘记了一个重要的细节:每个站点都有一个自动配置“pac”文件。

Windows\CurrentVersion\InternetSettings\AutoConfigURL 中有一个键,它指向本地服务器上的 HTTP 文档,其中包含看起来像 JavaScript 文件的内容。

pac 脚本基本上是一系列嵌套的 if 语句,它将 URL 与正则表达式进行比较,然后最终返回所选代理服务器的主机名。该脚本是一个名为 FindProxyForURL(url, host) 的 JavaScript 函数

因此,挑战在于找出任何给定服务器要使用哪个代理。唯一 100% 保证执行此操作的方法是查找 pac 文件并从 Python 调用 Javascript 函数。

有什么建议么?有没有更优雅的方法来做到这一点?

sun*_*ang 3

据我所知,在Windows环境中,如果没有设置代理环境变量,则从注册表的Internet设置部分获取代理设置。。还不够吗?

或者您可以从注册表中获取一些有用的信息: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer

编辑:
抱歉不知道如何格式化评论的源代码,我将其重新发布在这里。

>>> import win32com.client
>>> js = win32com.client.Dispatch('MSScriptControl.ScriptControl')
>>> js.Language = 'JavaScript'
>>> js.AddCode('function add(a, b) {return a+b;}')
>>> js.Run('add', 1, 2)
3
Run Code Online (Sandbox Code Playgroud)

  • @SalimFadhley,您是否有机会发布用于发现正确代理的代码?如果可以的话我将不胜感激! (2认同)