2010-10-14 14 views
5

Próbując uruchomić proces z innym tokenem dostępu, bez powodzenia działa on jako użytkownik nie podszywany.Problem z personifikacją Process.Start()

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

Jak to działa poprawnie?

Odpowiedz

1

Spróbuj przykład z 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); 
} 

Można również użyć CreateProcessAsUser okna funkcji.

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

+0

Dzięki, ale ten kod ma dokładnie taki sam wynik. – DxCK

+0

dodane kolejne rozwiązanie –

+1

'CreateProcessAsUser' nie może uruchomić plików innych niż exe, takich jak blabla.txt, więc ta opcja nie jest dla mnie dobra. – DxCK

6

Musisz ustawić ProcessStartInfo.UserName i właściwości Hasło. Z UseShellExecute ustawionym na false. Jeśli masz tylko token, a następnie pinvoke CreateProcessAsUser().

+0

Po ustawieniu UseShellExecute na false, nie mogę uruchomić plików innych niż exe, takich jak blabla.txt, więc ta opcja nie jest dla mnie dobra. – DxCK

+2

Cóż, uzyskanie ścieżki do .exe, która jest związana z rozszerzeniem nazwy pliku, jest zupełnie inne pytanie. Dobrze porozkładane przez inne wątki SO, nie ma potrzeby powtarzania go tutaj. ShellExecuteEx() po prostu nie obsługuje tworzenia procesu z innym (zastrzeżonym) tokenem użytkownika. Ta opcja nie jest dla ciebie dobra. –

+0

'CreateProcessAsUser' nie ma powiadomień' Exited', itp. Mam starszego kodu, który rozpoczyna proces wypełniając "ProcessStartInfo", subskrybuje 'Exited' i wywołuje' process.Start' gdzie indziej. Próbuję przenieść ten kod, aby mógł działać z danym tokenem i wygląda na to, że będę musiał napisać całą infrastrukturę samemu ... Całkiem sporo pracy. Chyba że Keivan odpowie. Najpierw muszę to wypróbować. –