Domanda

Sul mio sito Web (scritto in ASP.NET/C#) Voglio che i moderatori siano in grado di avviare un determinato servizio. Il codice che ho per questo è:

    ServiceController svcController = new ServiceController("InvidualFileConversion");

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

Ora quando eseguo ciò ottengo l'errore "Impossibile aprire il servizio InviDualFileConversion su computer", con il messaggio aggiuntivo: "ACCES viene negato".

So che questo è un problema con le autorizzazioni, ma Come faccio a darti le autorizzazioni appropriate? Non venire con la risposta in cui dovrei scrivere:, perché l'ho provato e non ha funzionato. Penso anche che non sia il modo migliore per impostarlo per tutto il sito Web quando ne ho solo bisogno per queste poche righe di codice.

Modifica: Ho aggiunto questo nel mio codice e non funziona ancora, ottengo la stessa eccezione nello stesso posto. Ora sembra questo:

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
        }
    }
}
.

Ho una classe impersonale che assomiglia a questo:

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
}
.

Quindi la cosa di convalida funziona ma non risolve il mio problema. Suppongo che ci sia ancora il problema con le autorizzazioni ... cosa faccio per cambiare questo?

Modifica 2: I prossimi passi che ho preso riguardo questo:

    .
  1. Creazione di una pool di app dove l'identità è impostata su un utente (che è membro di un gruppo di amministratore).
  2. Imposta il servizio "Accedi" allo stesso utente.
  3. Dopo aver eseguito nuovamente l'app Web, fallisce ancora ..
  4. comunque Se metto nell'account amministratore come credenziali nel codice, funziona .. (anche se non ho usato l'amministratore nella pool di app e sul servizio ...) < / P >.

    In altre parole, posso ottenere ciò che voglio con l'account amministratore, ma non con un account che ho creato e ha i diritti di amministrazione. Voglio ancora fare questo lavoro con un utente che mi sono reso come penso che non sia così sicuro mettere le tue credenziali dell'amministratore disponibili.

    Su un sidenote, sul server che lavoro su Ho un account che ha privilegi di amministratore, ma non è il 'account amministratore'.

    Modifica 3: Questo è strano. Sembra lavorare ora ma: - Senza il metodo di impersonazione (non ha funzionato). - Ho appena fatto ciò che ha detto Rob. Ho il mio pool di applicazioni con un utente che ho definito. Anche il servizio Windows ha questo utente specificato. (L'utente ricevuto accedere come servizio a destra) - Con questo, sembra funzionare. - Ma se il debug attraverso il mio sito web ottengo ancora ACCES negato. Ma se semplicemente accelera il mio sito web attraverso il browser e il suo IP posso avviare il servizio.

    Per riassumere: - Il metodo di impersonazione non funziona. - Utilizzando solo un pool di app auto-creato con l'utente di corrente funziona se il servizio ha anche specificato l'utente. Ma non funziona in modalità debug (ancora acceso negato lì).

    Questo post sta arrivando in grande e mi chiedo se qualcuno lo leggesse ancora .. ma forse ancora qualcuno può fornirmi dei dettagli? Ho paura che fallirà di nuovo da qualche parte in futuro ..

    Qualsiasi commento sarà apprezzato! Floris

È stato utile?

Soluzione

Devi assicurarti che il tuo sito web sia in esecuzione sotto un utente che ha abbastanza diritto di avviare il servizio. Assicurati anche che l'autenticazione anonima sia disabilitata su IIS Un buon modo potrebbe essere quello di creare un utente che ha i diritti per il servizio di avviamento sul server del server, quindi creare un pool di applicazioni che funziona sotto quell'utente. Quindi devi utilizzare il tuo sito Web. Usando questo approccio tutto il sito Web eseguirà sotto l'utente che hai appena creato. Se vuoi essere più granulare è possibile creare ancora l'utente che ha i diritti per avviare il servizio, ma invece di usarlo per il pool di applicazioni è possibile apportare solo la pagina che deve avviare la corsa del servizio in quell'utente utilizzando l'impersonazione. È possibile utilizzare la funzione di imporsonazione solo per questo metodo!

Per maggiori dettagli Dai un'occhiata ai link qui sotto:

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

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

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