私はPythonスクリプトを持っています。これは、サーバーからインターネットを介してさまざまなWeb APIにアクセスすることになっています。問題は、Python NTLM認証のサポートに関しては、これはかなり貧弱です。これにより、企業のプロキシサーバーは常にHTTPコード407を返します。私の最初のアイデアは、IISを使用してローカルプロキシサーバーをセットアップし、 NTLM認証の処理中にすべての要求を企業プロキシに転送するApplication Request Routingモジュール。このアプローチの問題は、現在のユーザーが実行しているNTLM資格情報を転送していないように見えることですPythonスクリプト.
このアプローチは機能しますか?もしそうなら、それをどのように実装できますか?
少し遅れるかもしれませんが、それでもなお言及したいと思います。スクリプトでNTLMをサポートすることはすばらしいことですが、それによって大きな利益が得られない場合は、複雑さが増します。 NTLMAps、Cntlm、またはPxを使用するのが最適な場合があります。
NTLMApsとCntlmは、中間プロキシとしてNTLM認証を行うプロキシです。ただし、ほとんどの場合Linuxユーザーを対象としているため、どちらにもユーザー/パスが必要です。私は歴史的にこれらのツールをWindowsで使用していましたが、資格情報を提供し、パスワードが変更されるたびに更新する必要があるという同じ要件に悩まされていました。
結果として、上記の2つのようなHTTPプロキシである Px for Windows を作成しましたが、SSPIを使用して、企業プロキシで必要な認証を管理します。構成する必要があるのは、プロキシサーバーとポートだけです。
独自のアプリを開発するために、コードはPythonおよびおそらくSSPIにアクセスできる他の言語内でこれを行う方法を理解するのにも役立つはずです。しかし、むしろNTLMの混乱を分離し、干渉しないほうがよいでしょう。それと。
これは本当に古い質問であることはわかっていますが、私が見たすべての回答では、NTLM資格情報をある種のpython NTLMプロキシ処理コードに入力する必要があります。これらのプロキシもバグが多い傾向があります。私の経験では、企業のプロキシシステム構成を自動的に検出し、現在のユーザーの資格情報を使用してNTLM認証を自動的に実行するWindows用のソリューションを作成しました。このソリューションはpywin32とCOM呼び出しを使用します。これはきれいではありませんが、うまく機能します、それで誰かに役立つ場合に備えてそれを渡したかったのです。
この例では、POSTの実行方法を示していますが、このコードから他のタイプのリクエストも簡単に理解できます。
import win32com.client
try:
import _winreg as winreg
except:
import winreg
class HTTP:
proxy = ""
isProxy = False
def __init__(self):
self.get_proxy()
def get_proxy(self):
oReg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
oKey = winreg.OpenKey(oReg, r'Software\Microsoft\Windows\CurrentVersion\Internet Settings')
dwValue = winreg.QueryValueEx(oKey, 'ProxyEnable')
if dwValue[0] == 1:
oKey = winreg.OpenKey(oReg, r'Software\Microsoft\Windows\CurrentVersion\Internet Settings')
dwValue = winreg.QueryValueEx(oKey, 'ProxyServer')[0]
self.isProxy = True
self.proxy = dwValue
def url_post(self, url, formData):
httpCOM = win32com.client.Dispatch('Msxml2.ServerXMLHTTP.6.0')
if self.isProxy:
httpCOM.setProxy(2, self.proxy, '<local>')
httpCOM.setOption(2, 13056)
httpCOM.Open('POST', url, False)
httpCOM.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
httpCOM.setRequestHeader('User-Agent', 'whatever you want')
httpCOM.send(formData)
return httpCOM.responseText
http = HTTP()
print(http.url_post('http://ipecho.net/', 'test=1'))