Question

J'ai un problème avec le démarrage des processus dans un contexte emprunté par ASP.NET 2.0.

Je commence un nouveau processus dans mon code de service 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();
}

Le " C: \ KB \ GetWindowUser.exe " est une application console contenant le code suivant:

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

Lorsque j'appelle un service Web sans emprunt d'identité, tout se passe bien.

Lorsque j'active l'emprunt d'identité, l'erreur suivante est inscrite dans " errors " variable dans le code de service Web:

Exception non gérée: System.Security.SecurityException: l'accès est refusé. \ r \ n \ r \ n sur System.Security.Principal.WindowsIdentity.GetCurrentInternal (TokenAccessLevels désiréAccess, Boolean threadOnly) \ r \ n sur System.Security. Principal.WindowsIdentity.GetCurrent () \ r \ n at ObfuscatedMdc.Program.Main (String [] args) \ r \ nLa zone qui a échoué est: \ r \ nMyComputer

L'utilisateur emprunté est un administrateur local et a accès au fichier exécutable C: \ KB \ GetWindowUser.exe.

Lorsque je spécifie explicitement l'utilisateur de la fenêtre dans les propriétés ProcesStartInfo du domaine, de l'utilisateur et du mot de passe, le message suivant s'affiche: http://img201.imageshack.us/img201/5870/pstartah8.jpg

Est-il possible de démarrer un processus avec des informations d'identification différentes de celles d'ASPNET à partir d'asp.net (IIS 5.1)?

Était-ce utile?

La solution

Vous devez insérer un code privilégié dans le GAC (ou l'exécuter en toute confiance).

Le code du GAC doit affirmer la XXXPermission, où XXX est quelle que soit l'autorisation que vous demandez, qu'il s'agisse de l'emprunt d'identité, de l'accès au disque dur ou autre.

Vous devez annuler l'assertion immédiatement après les mots.

Assurez-vous que l’API de votre DLL que vous avez insérée dans le GAC n’a aucune possibilité d’abus. Par exemple, si vous étiez en train d'écrire un site Web pour permettre aux utilisateurs de sauvegarder le serveur via une application de ligne de commande, votre API devrait présenter une méthode telle que & "; BackUp () &"; et pas " LaunchAribitraryProcess (chemin de la chaîne) "

L'emprunt d'identité doit également être configuré dans le fichier web.config, sinon vous rencontrerez des problèmes d'autorisations NTFS et de CAS.

Voici l'exploration complète .

Autres conseils

Vous pouvez également essayer de placer votre code dans

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

comme mentionné dans http://www.devnewsgroups.net/group/ microsoft.public.dotnet.framework.windowsforms / topic62740.aspx

Qu'est-ce que vous essayez exactement de faire? Je ne vois pas très bien à quoi sert votre code pour créer un exécutable différent. Cela semble plutôt étrange. Il serait peut-être plus utile d’énoncer le problème que vous essayez de résoudre en premier.

On dirait que vous essayez de faire en sorte que le service IIS emprunte l'identité d'un utilisateur disposant de privilèges plus élevés que le service lui-même (dans ce cas, un administrateur). Windows considère cela comme une faille de sécurité, car à ce moment-là, vous priez quelqu'un de prendre en charge votre système. Il existe peut-être un moyen de contourner cette limitation, mais ne le faites pas, c'est pour votre bien personnel.

Au lieu de cela, demandez à IIS d'emprunter l'identité d'un utilisateur disposant d'autorisations limitées et qui dispose exactement des droits dont vous avez besoin. Par exemple. créez un compte d'utilisateur qui ne possède que les dossiers dans lesquels votre service Web doit écrire, ou toute autre combinaison de droits appropriée. Si vous empruntez l'identité d'un utilisateur limité, vous ne verrez pas ce code d'erreur, mais vous pourrez quand même appeler le fichier exécutable bénin que vous avez ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top