Question

sur mon site Web (écrit dans asp.net/c#) je veux que les modérateurs puissent démarrer un certain service. Le code que j'ai pour cela est:

    ServiceController svcController = new ServiceController("InvidualFileConversion");

    if (svcController != null)
    {
        try
        {
            svcController.Stop();
            svcController.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10));
            svcController.Start();
        }
        catch (Exception ex)
        {
            // error
        }
    }

Maintenant, lorsque j'exécute cette erreur, j'obtiens l'erreur "Impossible d'ouvrir le service InvidualFileconVersion sur ordinateur", avec le message supplémentaire: "Acces est refusé".

Je sais que c'est un problème avec les autorisations, mais Comment puis-je me donner les autorisations appropriées? Ne viens pas avec la réponse où je devrais écrire:, parce que je l'ai essayé et ça n'a pas fonctionné. De plus, je pense que ce n'est pas vraiment la meilleure façon de la configurer pour l'ensemble du site Web lorsque j'en ai juste besoin pour ces quelques lignes de code.

edit: J'ai ajouté cela dans mon code et cela ne fonctionne toujours pas, j'ai la même exception au même endroit. Maintenant, ça ressemble à ceci:

protected void ConvertLink_OnClick(object sender, EventArgs e)
{
    //convert();
    try
    {
        //--need to impersonate with the user having appropriate rights to start the service
        Impersonate objImpersonate = new Impersonate(domainName, userName, userPassword);
        if (objImpersonate.impersonateValidUser())
        {
            //--write code to start/stop the window service
            startWindowsService();
            objImpersonate.undoImpersonation();
        }
    }
    catch (Exception Ex)
    { Response.Write(Ex.Message + Ex.InnerException.Message); }
}

private void startWindowsService()
{
    ServiceController svcController = new ServiceController("InvidualFileConversion");

    if (svcController != null)
    {
        try
        {
            svcController.Stop();
            svcController.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10));
            svcController.Start();
        }
        catch (Exception ex)
        {
            // error
        }
    }
}

J'ai une classe d'impersonate qui ressemble à ceci:

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Security.Principal;
using System.Runtime.InteropServices;

/// <summary>
/// Summary description for Impersonate
/// </summary>
public class Impersonate
{

#region "Class Members"
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
WindowsImpersonationContext impersonationContext;
#endregion

#region "Class Properties"
public string domainName { get; set; }
public string userName { get; set; }
public string userPassword { get; set; }
#endregion

public Impersonate()
{
    //
    // TODO: Add constructor logic here
    //
}
public Impersonate(string domainName, string userName, string userPassword)
{
    this.domainName = domainName;
    this.userName = userName;
    this.userPassword = userPassword;
}

#region "Impersonation Code"
[DllImport("advapi32.dll")]
public static extern int LogonUserA(String lpszUserName,
    String lpszDomain,
    String lpszPassword,
    int dwLogonType,
    int dwLogonProvider,
    ref IntPtr phToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int DuplicateToken(IntPtr hToken,
    int impersonationLevel,
    ref IntPtr hNewToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool RevertToSelf();

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);
public bool impersonateValidUser()
{
    WindowsIdentity tempWindowsIdentity;
    IntPtr token = IntPtr.Zero;
    IntPtr tokenDuplicate = IntPtr.Zero;

    if (RevertToSelf())
    {
        if (LogonUserA(this.userName, this.domainName, this.userPassword, LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT, ref token) != 0)
        {
            if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
            {
                tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                impersonationContext = tempWindowsIdentity.Impersonate();
                if (impersonationContext != null)
                {
                    CloseHandle(token);
                    CloseHandle(tokenDuplicate);
                    return true;
                }
            }
        }
    }
    if (token != IntPtr.Zero)
        CloseHandle(token);
    if (tokenDuplicate != IntPtr.Zero)
        CloseHandle(tokenDuplicate);
    return false;
}

public void undoImpersonation()
{
    impersonationContext.Undo();
}
#endregion
}

La chose de validation fonctionne donc mais ne résout pas mon problème .. Je suppose qu'il y a toujours le problème avec les autorisations .. Que dois-je faire pour changer cela?

edit 2: Les prochaines étapes que j'ai prises impliquent ceci:

  1. Création d'un pool d'applications où l'identité est définie sur un utilisateur (membre d'un groupe d'administrateur).
  2. Définissez le service "Connexion" sur le même utilisateur.
  3. Après avoir exécuté l'application Web à nouveau, il échoue toujours.
  4. Cependant, Si je mets dans le compte administrateur comme des informations d'identification dans le code, cela fonctionne .. (Même si je n'avais pas utilisé l'administrateur dans le pool d'applications et sur le service ...) < / p>

    En d'autres termes, je peux obtenir ce que je veux avec le compte administrateur, mais pas avec un compte que j'ai créé et a les droits d'administration. Je veux toujours faire ce travail avec un utilisateur que je me suis fait car je pense que ce n'est pas si sûr de mettre vos informations d'identification administratrice disponibles.

    sur un Sidenote, sur le serveur que je travaille sur, j'ai un compte contenant des privilèges d'administrateur, mais ce n'est pas le compte de l'administrateur.

    EDIT 3: Ceci devient bizarre. Je semble travailler maintenant mais: - Sans la méthode d'impersonation (il n'a pas fonctionné). - Je viens de faire ce que Rob a dit. J'ai mon propre piscine d'application avec un utilisateur que j'ai défini. Le service Windows a également spécifié cet utilisateur. (L'utilisateur a reçu la connexion en tant que service droit) - Avec cela, il semble fonctionner. - Mais si déboguez sur mon site Web, je reçois toujours des accès refusés. Mais s'il suffit d'accéder à mon site Web via le navigateur et son IP, je peux commencer le service.

    Pour résumer: - La méthode d'impersonnation ne fonctionne pas. - Il suffit d'utiliser un pool d'applications auto créé avec l'utilisateur du Curret fonctionne si le service a également spécifié l'utilisateur. Mais cela ne fonctionne pas dans le mode de débogage (accès toujours refusé).

    Ce message se rend à grande et je me demande si tout le lit toujours vraiment. Mais peut-être que quelqu'un peut toujours me fournir des détails? Je crains que cela échoue encore quelque part dans le futur ..

    Tout commentaire sera apprécié! Floris

Était-ce utile?

La solution

Vous devez vous assurer que votre site Web fonctionne sous un utilisateur qui a assez de droit de démarrer le service. Assurez-vous également que l'authentification anonyme est désactivée sur IIS Un bon moyen pourrait être de créer un utilisateur qui a des droits pour le service de démarrage sur le serveur Web, puis créez un pool d'applications qui fonctionne sous cet utilisateur.En vous devez faire utiliser votre site Web que le pool d'applications. En utilisant cette approche, tout le site Web sera exécuté sous l'utilisateur que vous venez de créer. Si vous voulez être plus granuleux, vous pouvez toujours créer l'utilisateur qui dispose des droits de démarrage du service, mais au lieu de l'utiliser pour le pool d'applications, vous ne pouvez effectuer que la page qui doit démarrer le service exécuté sous cet utilisateur en utilisant l'impersonnation. Vous pouvez utiliser la fonction d'importonation uniquement pour cette méthode!

Pour plus de détails, consultez les liens ci-dessous:

http://forums.asp.net/t/1137962.aspx/1 < / a>

http://support.microsoft.com/kb/306158

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