Tôi mới sử dụng bảo mật Windows ... nhưng đọc MSDN và một số blog có vẻ như với cách mà MS muốn chúng tôi xử lý dữ liệu cụ thể của người dùng khác bằng cách nhận mã thông báo người dùng.
Đã từng có một wiki tốt đẹp của Keith Brown Net phát triển Hướng dẫn về Windows Security ... bạn vẫn có thể tìm thấy nó trong bộ nhớ cache của Google cho "Pluralsight keith.guidebook"
Trường hợp 1: Nếu bạn don Không có mật khẩu người dùng:
Đối với tài khoản cục bộ, bạn có thể thử đọc đăng ký Windows như Nas Banov đã đề xuất và có một số công thức nấu ăn khác trên SO hoặc Internet.
Tôi không chắc chắn các phiên bản Windows khác nhau hoạt động như thế nào để tạo người dùng ... những người chưa bao giờ thực hiện đăng nhập phiên tương tác ... nó có tự động tạo đăng ký, thư mục chính và dữ liệu tiểu sử của họ không? Tôi đã thực hiện một số kiểm tra trên Windows XP và các khóa đăng ký không có sau khi tạo tài khoản cục bộ ... nhưng trong trường hợp này bạn có thể thử đoán dựa trên giá trị đăng ký Tất cả người dùng ... hoặc chỉ thất bại :)
Đối với các ứng dụng dành cho máy tính để bàn, khi ứng dụng đang chạy với tư cách là người dùng đã đăng nhập, tôi đang sử dụng một cái gì đó như thế này để nhận thư mục chính .... và để có được tương đương ~/.local Tôi đang sử dụng CSIDL_APPDATA, cho hồ sơ chuyển vùng hoặc chỉ là CSIDL_LOCAL_APPDATA.
from win32com.shell import shell, shellcon
# See microsoft references for further CSIDL constants
# http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx
folder_name = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, 0, 0)
bài viết Reading Keith Brown "How To Get A Token For A User" .. bạn có thể tìm kiếm một số cách khác để nhận được một token của user mà không có một mật khẩu ...
Trường hợp 2: Nếu bạn có mật khẩu người dùng:
Đọc MSDN Tôi đã gây ấn tượng rằng nếu tôi có mã thông báo người dùng, tôi có thể nhận các thư mục bằng cách gọi một cái gì đó giống như mã bên dưới ... nhưng nó không hoạt động đối với tôi. (không chắc chắn lý do tại sao)
token = win32security.LogonUser(
username,
None, # we uses UPN format for username
password,
win32security.LOGON32_LOGON_NETWORK,
win32security.LOGON32_PROVIDER_DEFAULT,
)
folder_name = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, token, 0)
Đây là lý do tại sao tôi kết thúc bằng mã này ... không hoàn hảo do thực tế là nó yêu cầu tên người dùng và mật khẩu.
token = win32security.LogonUser(
username,
None, # Here should be the domain ... or just go with default values
password,
win32security.LOGON32_LOGON_NETWORK,
win32security.LOGON32_PROVIDER_DEFAULT,
)
win32security.ImpersonateLoggedOnUser(token)
folder_name = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, 0, 0)
win32security.RevertToSelf()
Câu hỏi này được bằng cách nào đó liên quan: How to find the real user home directory using python?
Luôn yêu một "Python trên Windows" câu hỏi hay. Càng sớm chúng tôi mang đến sự khai ngộ cho nền tảng đó (nếu có thể), thì tốt hơn cho tất cả mọi người. –
'~ user' không được phép làm việc trên 2.5, nó được thực hiện trong 2.6+ nhưng theo cách _broken_ - xem câu trả lời của tôi dưới đây để thực hiện làm việc. Có, đã phải nhìn trộm trong registry tôi sợ. –