2012-11-02 55 views
5

Tôi đang cố gắng lấy thông tin từ một url yêu cầu đăng nhập NTLM.Đăng nhập bằng Python NTLM

Tôi đã nhận được lỗi 401 ban đầu và sau khi một số chỉnh sửa có thể kéo trang cho biết rằng tôi có thông tin xác thực không hợp lệ đầu vào.

Tên người dùng và mật khẩu chính xác nhưng tôi không thể vượt qua trang thông tin đăng nhập không hợp lệ.

Lgn2.py:

import urllib2 
import HTTPNtlmAuthHandler 

login = open('c:/temp/login.txt') 
open = login.read() 
to = open.split() 
user = str(to[0]) 
password = str(to[1]) 

url = "http://INSERT URL HERE.com/" 
passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, url, user, password) 
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman) 


opener = urllib2.build_opener(auth_NTLM) 
urllib2.install_opener(opener) 


response = urllib2.urlopen(url) 
print(response.read()) 

Tôi có một tên người dùng bao gồm một \ sử dụng phương pháp trên, chúng tôi không nhận được một dấu gạch chéo kép trong tên khi in. Tôi có nên giữ nó đến nơi in sẽ có dấu gạch chéo ngược đôi trong tên như apposed để chính xác như các tập tin txt có tên người dùng đánh vần?

Tệp txt chỉ là một tài liệu txt chỉ với: tên miền \ tên người dùng \ mật khẩu.

Dấu gạch chéo ngược thứ hai ở giữa tên người dùng sẽ là một phần của tên người dùng.

Mọi trợ giúp sẽ được đánh giá cao.

+0

http://code.google.com/p/python-ntlm/ có tên người dùng giống như 'DOMAIN \ User'. Tên người dùng của bạn có miền trong đó không? –

+0

nếu không có miền, nó sẽ trả về 401 –

+1

Trang web của bạn sử dụng cơ chế xác thực nào? Nếu nó không được đặt để cho phép xác thực cơ bản, thì bạn phải sử dụng thông báo - xem ví dụ mở rộng trên http://code.google.com/p/python-ntlm/ – Seth

Trả lời

2

Có lẽ bạn đã không sử dụng một raw string:

Trừ một 'r' hoặc tiền tố 'R' là hiện tại, thoát khỏi chuỗi trong chuỗi được giải thích theo quy tắc tương tự như những người sử dụng của Standard C .

>>> 'domain\user' 
    File "<stdin>", line 1 
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 6-7: truncated \uXXXX escape 
>>> r'domain\user' 
'domain\\user' 

này làm việc cho tôi (bằng Python 2, chứ không phải 3):

from ntlm import HTTPNtlmAuthHandler 
import urllib2 

user = r'domain\user' 
password = "passphrase" 
passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, "http://projects/", user, password) 
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman) 
opener = urllib2.build_opener(auth_NTLM) 
urllib2.install_opener(opener) 

url = "http://projects/_vti_bin/owssvr.dll?Cmd=Display&List=etc" 
response = urllib2.urlopen(url) 
headers = response.info() 
print("headers: {}".format(headers)) 
body = response.read() 
print("response: " + body) 
+0

Bài đăng của bạn rất hữu ích, tôi cũng muốn thêm tiêu đề xác thực trong ntlm tên biến là Userauth, hãy giúp tôi –

+0

Cảm ơn bạn vì điều này! – bernie

6

Công ty chúng tôi có một proxy và sử dụng NTLM. Để kết nối mà không phải đặt thông tin xác thực trong tập lệnh tôi đã sử dụng:

import win32com.client 

url = 'https://...' 

h = win32com.client.Dispatch('WinHTTP.WinHTTPRequest.5.1') 
h.SetAutoLogonPolicy(0) 
h.Open('GET', url, False) 
h.Send() 
result = h.responseText 
result 
+0

Bạn sử dụng winreg ở đâu? – Garan

+0

Tôi có thể đã sử dụng winreg cho một cái gì đó khác trong mã của tôi. Tôi không thể nhớ. Tôi không nghĩ rằng nó là cần thiết cho các bên trên để làm việc. Hãy cho tôi biết làm thế nào bạn nhận được trên với nó. – toasteez

+0

Vâng, nó đã mở thành công các trang ... Nhưng sau đó nó chỉ ra rằng chúng ta cần phải chạy chương trình của chúng tôi trên Linux và tôi đã không kiểm tra này kể từ đó. – Garan

Các vấn đề liên quan