2010-04-26 37 views
7

Có cách nào để xác thực là người dùng cục bộ (không phải mạng) để sao chép tệp qua mạng trong .Net không?Sao chép tệp qua mạng (yêu cầu xác thực)

net use không phải là tùy chọn và tôi dường như không thể nhận được LogonUser để hoạt động.

Bất kỳ ý tưởng nào?


[Chỉnh sửa] Dưới đây là một số mã:

public class UserImpersonator : IDisposable 
{ 
    private WindowsImpersonationContext _impersonationContext; 
    private IntPtr _userHandle = IntPtr.Zero; 

    [DllImport("advapi32.dll", SetLastError = true)] 
    private static extern bool LogonUser(
     string lpszUsername, 
     string lpszDomain, 
     string lpszPassword, 
     int dwLogonType, 
     int dwLogonProvider, 
     out IntPtr phToken 
     ); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    private static extern bool CloseHandle(IntPtr hHandle); 

    public UserImpersonator(string username, string password) 
    { 
     LogonUser(username, "", password, (int)LogonType.LOGON32_LOGON_NETWORK, 
        (int)LogonProvider.LOGON32_PROVIDER_DEFAULT, out _userHandle); 
     _impersonationContext = WindowsIdentity.Impersonate(_userHandle); 
    } 

    public void Dispose() 
    { 
     CloseHandle(_userHandle); 
     _impersonationContext.Undo(); 
    } 

    private enum LogonType : int 
    { 
     LOGON32_LOGON_INTERACTIVE = 2, 
     LOGON32_LOGON_NETWORK = 3, 
     LOGON32_LOGON_BATCH = 4, 
     LOGON32_LOGON_SERVICE = 5, 
     LOGON32_LOGON_UNLOCK = 7, 
     LOGON32_LOGON_NETWORK_CLEARTEXT = 8, 
     LOGON32_LOGON_NEW_CREDENTIALS = 9, 
    } 

    private enum LogonProvider 
    { 
     LOGON32_PROVIDER_DEFAULT = 0, 
    } 
} 

Khi tôi quấn hoạt động File.Copy trong using(new UserImpersonator(username, password)), tôi nhận được:

System.IO.IOException: Đăng nhập thất bại : tên người dùng hoặc mật khẩu không xác định.

Nếu trước tiên, tôi cố gắng kết nối với phần chia sẻ trong trình khám phá (nhập thông tin xác thực khi nó yêu cầu), File.Copy hoạt động. Có vẻ như mã trên không làm gì cả.

Trả lời

0

Bạn thực sự cần đăng nhập vào tài khoản cục bộ là thành viên của nhóm trên bộ điều khiển miền hoặc chỉ đăng nhập trực tiếp vào tài khoản DC. Mặc dù không có thêm thông tin, tôi không chắc bạn đang gặp rắc rối gì. Bạn có thể gửi mã không?

chỉnh sửa

Ok, tôi thấy hai vấn đề.

Vấn đề chính là bạn đang chuyển một chuỗi trống cho tham số miền của LogonUser. Thử truyền tên máy cục bộ hoặc mạng DC.

Vấn đề phụ là bạn cần phải đăng nhập bằng cách sử dụng hàng loạt hoặc tương tác, không phải mạng. Đăng nhập mạng cung cấp cho bạn mã thông báo mạo danh, không phải là thông tin đăng nhập chính, điều này có thể ngăn bạn tiếp cận tài nguyên mạng trừ khi ủy quyền được bật.

Ngoài ra, khi bạn làm việc này, bạn sẽ muốn loại bỏ toàn bộ IntPtr và thay thế nó bằng SafeHandle.

+0

@Steven: Xem chỉnh sửa. –

+0

Vui lòng cho chúng tôi biết nếu điều đó có ích. –

+0

Và nếu tên máy tính không xác định ..? (Tôi chỉ biết IP) –

1

Tôi có thể hướng dẫn bạn đến câu trả lời của tôi, tôi đặt trên here? Nó sẽ làm việc cho nhu cầu của bạn.

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