2010-10-14 32 views
5

Cố gắng bắt đầu quá trình bằng một mã thông báo truy cập khác, mà không thành công, nó chạy với tư cách người dùng không mạo danh.Sự cố mạo danh Process.Start()

using (WindowsIdentity identity = new WindowsIdentity(token)) 
using (identity.Impersonate()) 
{ 
    Process.Start("blabla.txt"); 
} 

Cách thực hiện công việc này đúng cách?

Trả lời

1

Hãy thử ví dụ này từ http://msdn.microsoft.com/en-us/library/w070t6ka.aspx

private static void ImpersonateIdentity(IntPtr logonToken) 
{ 
    // Retrieve the Windows identity using the specified token. 
    WindowsIdentity windowsIdentity = new WindowsIdentity(logonToken); 

    // Create a WindowsImpersonationContext object by impersonating the 
    // Windows identity. 
    WindowsImpersonationContext impersonationContext = 
     windowsIdentity.Impersonate(); 

    Console.WriteLine("Name of the identity after impersonation: " 
     + WindowsIdentity.GetCurrent().Name + "."); 

    //Start your process here 
    Process.Start("blabla.txt"); 

    Console.WriteLine(windowsIdentity.ImpersonationLevel); 
    // Stop impersonating the user. 
    impersonationContext.Undo(); 

    // Check the identity name. 
    Console.Write("Name of the identity after performing an Undo on the"); 
    Console.WriteLine(" impersonation: " + 
     WindowsIdentity.GetCurrent().Name); 
} 

Bạn cũng có thể sử dụng CreateProcessAsUser cửa sổ chức năng.

http://www.pinvoke.net/default.aspx/advapi32/createprocessasuser.html

+0

Xin cảm ơn, nhưng mã này có kết quả giống hệt nhau. – DxCK

+0

đã thêm một giải pháp –

+1

'CreateProcessAsUser' không thể bắt đầu các tệp không phải exe như blabla.txt, vì vậy tùy chọn này không tốt cho tôi. – DxCK

6

Bạn cần phải đặt ProcessStartInfo.UserName và tài sản Password. Với UseShellExecute được đặt thành false. Nếu bạn chỉ có một mã thông báo thì hãy ghim CreateProcessAsUser().

+0

Khi đặt UseShellExecute thành false, tôi không thể bắt đầu các tệp không phải exe như blabla.txt, vì vậy tùy chọn này không tốt cho tôi. – DxCK

+2

Vâng, nhận đường dẫn đến .exe được liên kết với phần mở rộng tên tệp là một câu hỏi hoàn toàn khác. Cũng được bao phủ bởi các chủ đề SO khác, không cần phải lặp lại nó ở đây. ShellExecuteEx() chỉ không hỗ trợ tạo quy trình với mã thông báo người dùng (bị hạn chế) khác. Tùy chọn đó không tốt cho bạn. –

+0

'CreateProcessAsUser' không có thông báo' Exited', v.v. Tôi có mã kế thừa bắt đầu quá trình điền vào 'ProcessStartInfo', đăng ký vào' Exited' và gọi 'process.Start' ở một nơi khác. Tôi đang cố gắng chuyển mã này để nó có thể làm việc với một mã thông báo cụ thể và có vẻ như tôi sẽ phải tự viết tất cả cơ sở hạ tầng ... Khá nhiều công việc. Trừ khi Keivan trả lời. Tôi cần phải thử điều đó trước. –

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