2013-01-08 23 views
6

Chúng tôi đang phát triển dịch vụ Windows C# .NET.Mạo danh người dùng

Dịch vụ của chúng tôi đang chạy trong tài khoản hệ thống và chúng tôi đang cố mạo danh người dùng đã đăng nhập USER. Tính mạo danh hoạt động ok, tức là khi gọi System.Security.Principal.WindowsIdentity.GetCurrent() sau khi mạo danh, chúng tôi có được đúng người dùng 'USER'.

Vấn đề là khi chúng tôi cố gắng truy cập hồ sơ người dùng, chúng tôi không nhận được kết quả mong đợi. Một ví dụ là truy cập vào sổ đăng ký CURRENT_USER. Chúng tôi nhận được lỗi truy cập bị từ chối. Khi sử dụng chức năng của bên thứ ba, mà chúng tôi giả định sử dụng đăng ký một phần, chúng tôi nhận được chi tiết về người dùng "thực sự" (trước khi mạo danh). Ngoài ra khi gọi Environment.ExpandEnvironmentVariables("%TEMP%"), chúng tôi sẽ nhận được hồ sơ hệ thống thay vì hồ sơ người dùng đã đăng nhập.

Có cách nào để mạo danh hoàn toàn người dùng khác không ?. Tôi biết chúng tôi có thể sử dụng LoadUserProfile để có được một hồ sơ người dùng cụ thể, nhưng điều này là không tốt cho chúng tôi, bởi vì chúng tôi đang chạy một dll bên thứ ba sử dụng hồ sơ người dùng hiện tại.

đang mạo danh của chúng tôi là dựa trên this

+1

Trước hết, bạn nên sử dụng System.IO.Path.GetTempPath(); và nếu điều đó vẫn không hoạt động, đây có thể là vấn đề của bạn: http://stackoverflow.com/questions/944483/how-to-get-temporary-folder-for-current-user Xem câu trả lời được chấp nhận và cách thức hoạt động của nó. – lahsrah

+0

hãy để tôi cụ thể hơn. chúng tôi đang sử dụng các cuộc gọi đến một dll của bên thứ ba mà chúng tôi không thể thay đổi. vì vậy nếu họ đang triển khai một hồ sơ người dùng cụ thể, chúng tôi phải thực hiện quy trình chạy với hồ sơ người dùng đó. – user844541

+0

@ user844541 vui lòng đọc lại liên kết của tôi. – lahsrah

Trả lời

2

Tôi nhận thấy rằng mã không gọi LoadUserProfile, vì vậy hồ sơ cá nhân người sử dụng không được tải.

Lưu ý trong nhận xét của hàm đó, HKEY_CURRENT_USER vẫn chưa được thay thế.

I nghĩ bạn có thể giải quyết vấn đề này (trước khi gọi cho bên thứ ba DLL) bằng cách gọi RegOverridePredefKey.

Lưu ý rằng rất nhiều voodoo có thể liên quan đến việc làm tất cả điều này - tôi sẽ cố gắng đảm bảo ghi đè xảy ra càng sớm càng tốt trước cuộc gọi của bên thứ ba và được hoàn nguyên càng sớm càng tốt (hy vọng rằng đây là tất cả một cuộc gọi đến thư viện).

Thay vào đó, tôi nghiêm túc thử tìm kiếm xung quanh cho một dịch vụ bên thứ ba khác mà không yêu cầu tất cả điều này nhảy qua hoops.

+0

Gọi 'RegOverridePredefKey' sẽ không giúp ích trong trường hợp này bởi vì đó là mỗi quá trình và mạo danh là mỗi luồng. – Ben

2

Như bạn đã phát hiện, mạo danh sẽ không thiết lập HKEY_CURRENT_USER hoặc môi trường.

Điều này là do mã thông báo mạo danh là mỗi luồng và HKCU và môi trường là theo từng quy trình.

Nếu bạn cần truy cập vào môi trường thông thường của người dùng, bạn cần phải sử dụng HKEY_USERS\SID và SID của người dùng bị mạo danh, ví dụ: Ví dụ: HKEY_USERS\S-1-5-21-12345678-12345678-12345678-1234. Hãy gọi LoadUserProfile để đảm bảo khóa được tải. (Nếu nó được coi là người dùng hiện đang đăng nhập, nó sẽ được tải, vì vậy bạn có lẽ không nên làm điều đó, nhưng kiểm tra nó tồn tại và trả về một lỗi nếu không).

Bạn cũng có thể tìm ra môi trường thông thường của mình, vì điều này nằm trong "Môi trường" chính trong HKCU. Bạn chỉ cần kết hợp điều đó với môi trường hệ thống.

Nếu bên thứ ba DLL thực sự yêu cầu HKCU và môi trường được thiết lập chính xác, bạn sẽ cần phải tạo một quy trình trong phiên đăng nhập của người dùng để lưu trữ tệp DLL và gửi kết quả của bất kỳ hoạt động nào trở lại. Nếu chỉ có môi trường là bắt buộc, bạn có thể tạo một tiến trình con và thiết lập môi trường theo cách thủ công.

Tuy nhiên bạn chưa nói lý do bạn muốn thực hiện việc này. Có vẻ như bạn đã giải quyết vấn đề này như một phần của giải pháp cho một vấn đề lớn hơn. Nếu có thể, tôi khuyên bạn nên xem liệu có cách nào để làm những gì bạn cần mà không cần môi trường của người dùng hoặc HKCU.

Tại sao tệp DLL chỉ chạy trực tiếp trong phiên của riêng người dùng? Tại sao một dịch vụ được yêu cầu? Bạn có thể tái kiến ​​trúc giải pháp của mình để có một phần chế độ người dùng chạy trong phiên đăng nhập và lưu trữ DLL của bên thứ ba và nó giao tiếp với dịch vụ sao cho dịch vụ chỉ thực hiện những gì được yêu cầu hoàn toàn?

+0

+1 Đối với đề xuất có thứ gì đó đang chạy trong phiên người dùng. Hầu như mỗi lần tôi gặp vấn đề tương tự với các dịch vụ và tài khoản người dùng, đó là cách để đi. – Basic