Domanda

Ho problemi con l'avvio dei processi in un contesto impersonato in ASP.NET 2.0.

Sto iniziando un nuovo processo nel mio codice del servizio web. IIS 5.1, .NET 2.0

[WebMethod]
public string HelloWorld()
{
    string path = @"C:\KB\GetWindowUser.exe";
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.WorkingDirectory = Path.GetDirectoryName(path);
    startInfo.FileName = path;
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;
    startInfo.ErrorDialog = false;
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardError = true;
    Process docCreateProcess = Process.Start(startInfo);

    string errors = docCreateProcess.StandardError.ReadToEnd();
    string output = docCreateProcess.StandardOutput.ReadToEnd();
}

Il " C: \ KB \ GetWindowUser.exe " è un'applicazione console contenente il seguente codice:

static void Main(string[] args)
{
    Console.WriteLine("Windows: " + WindowsIdentity.GetCurrent().Name);
}

Quando invoco il servizio Web senza imitazione, tutto funziona correttamente.

Quando si attiva la rappresentazione, il seguente errore è scritto in " errori " variabile nel codice del servizio web:

Eccezione non gestita: System.Security.SecurityException: accesso negato. \ r \ n \ r \ n su System.Security.Principal.WindowsIdentity.GetCurrentInternal (TokenAccessLevels desiderataAccess, Boolean threadOnly) \ r \ n su System.Security. Principal.WindowsIdentity.GetCurrent () \ r \ n su ObfuscatedMdc.Program.Main (String [] args) \ r \ nLa zona dell'assembly non riuscita era: \ r \ nMyComputer

L'utente rappresentato è l'amministratore locale e ha accesso all'eseguibile C: \ KB \ GetWindowUser.exe.

Quando specifico esplicitamente l'utente della finestra nelle proprietà ProcesStartInfo Dominio, Utente e Password, ho ricevuto il seguente messaggio: http://img201.imageshack.us/img201/5870/pstartah8.jpg

È possibile avviare il processo con credenziali diverse da ASPNET da asp.net (IIS 5.1)?

È stato utile?

Soluzione

Devi inserire il codice privilegiato nel GAC (o eseguirlo in piena fiducia).

Il codice nel GAC deve far valere XXXPermission, dove XXX è ciò che mai si richiede l'autorizzazione, sia che si tratti di rappresentazione, accesso al disco rigido o che cosa si possiede.

Dovresti ripristinare l'asserzione immediatamente dopo le parole.

Dovresti assicurarti che l'API sulla tua DLL inserita nel GAC non abbia opportunità di abuso. Ad esempio, se stavi scrivendo un sito Web per consentire agli utenti di eseguire il backup del server tramite un'applicazione da riga di comando, la tua API dovrebbe esporre un metodo come & Quot; BackUp () & Quot; e non " LaunchAribitraryProcess (percorso stringa) "

Anche nel file web.config deve essere impostata la rappresentazione, altrimenti si verificheranno problemi di autorizzazione NTFS e CAS.

Ecco la spiegazione completa .

Altri suggerimenti

Potresti anche provare a racchiudere il tuo codice all'interno

using (Impersonator person = new Impersonator("domainName", "userName",
"password")
{
    // do something requiring special permissions
}

come menzionato in http://www.devnewsgroups.net/group/ microsoft.public.dotnet.framework.windowsforms / topic62740.aspx

Cosa stai esattamente cercando di fare? Non riesco a capire quale sia il punto del tuo codice nel creare un altro eseguibile. Sembra piuttosto strano. Forse sarebbe più utile dichiarare il problema di affari che stai cercando di risolvere per primo.

Sembra che tu stia cercando di impersonare un servizio IIS con un utente con privilegi più alti rispetto al servizio stesso (in questo caso, un amministratore). Windows lo blocca come una falla di sicurezza, poiché a quel punto stai praticamente implorando qualcuno di assumere il controllo del tuo sistema. Potrebbe esserci un modo per aggirare questa limitazione, ma non farlo - è per il tuo bene.

Invece, IIS deve impersonare un utente con autorizzazioni limitate, che ha esattamente i diritti di cui hai bisogno. Per esempio. creare un account utente che possiede solo le cartelle in cui si desidera scrivere il servizio Web o qualunque altra combinazione di diritti sia appropriata. Se impersona un utente limitato, non vedrai questo codice di errore, ma dovresti comunque essere in grado di chiamare l'eseguibile benigno che hai qui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top