Pregunta

En mi sitio web (escrito en ASP.NET/C#) Quiero que los moderadores puedan iniciar un cierto servicio. El código que tengo para esto es:

    ServiceController svcController = new ServiceController("InvidualFileConversion");

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

Ahora, cuando ejecuto esto, obtengo el error "No se puede abrir el servicio InvidualFileConversion en la computadora", con el mensaje adicional: "Se denega Access".

Sé que este es un problema con los permisos, pero ¿Cómo me doy los permisos adecuados? No vengas con la respuesta donde debería escribir:, porque lo he probado y no funcionó. También creo que no es realmente la mejor manera de configurar esto para todo el sitio web cuando solo lo necesito por estas pocas líneas de código.

Editar: He agregado esto en mi código y aún no funciona, obtengo la misma excepción en el mismo lugar. Ahora se ve así:

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

Tengo una clase de impersonado que se parece a esto:

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
}

Entonces, la cosa de la validación funciona, pero no resuelve mi problema ... Supongo que todavía hay el problema con los permisos ... ¿Qué hago para cambiar esto?

Editar 2: Los siguientes pasos que tomé involucrar esto:

  1. Creación de un grupo de aplicaciones donde la identidad se establece en un usuario (que es miembro de un grupo de administradores).
  2. Configure el servicio "Inicie sesión" en el mismo usuario.
  3. después de ejecutar la aplicación web de nuevo, todavía falla ...
  4. Sin embargo, Si pongo la cuenta del administrador como credenciales en el código, funciona. (Aunque no utilicé el administrador en la piscina de la aplicación y en el servicio ...) < / p>

    En otras palabras, puedo obtener lo que quiero con la cuenta de administrador, pero no con una cuenta que me creé y tiene los derechos de administrador. Todavía quiero hacer que este trabajo con un usuario me hice, ya que creo que no es tan seguro poner a disposición sus credenciales de administrador.

    En un sidenote, en el servidor en el que trabajo tengo una cuenta que tiene privilegios de administrador, pero no es la cuenta 'Administrador'.

    Editar 3: Esto se está volviendo raro. Parece que ahora trabajo, pero: - Sin el método de impersonación (no funcionó). - Acabo de hacer lo que Rob dijo. Tengo mi propio grupo de aplicaciones con un usuario que definí. El servicio de Windows también tiene ese usuario especificado. (El usuario recibió el inicio de sesión como derecho de servicio) - Con esto, parece funcionar. - Pero si se depara de mi sitio web, todavía me negan el acceso. Pero si solo accede a mi sitio web a través del navegador y su IP puedo iniciar el servicio.

    para resumirlo: - El método de impersonación no funciona. - Solo usando un grupo de aplicaciones auto creado con el usuario de Curtuts funciona si el servicio también ha especificado el usuario. Pero no funciona en modo de depuración (todavía se denegó el acceso allí).

    Esta publicación es llegar a grande y me pregunto si alguna vez realmente lo lee ... pero tal vez alguien puede proporcionarme cualquier detalle. Me temo que volverá a fallar en algún lugar del futuro ..

    ¡Cualquier comentario será apreciado! Floris

¿Fue útil?

Solución

Debe asegurarse de que su sitio web se esté ejecutando bajo un usuario que tenga suficiente derecho para iniciar el servicio. Asegúrate de también que la autenticación anónima está deshabilitada en IIS Una buena manera podría ser crear un usuario que tenga derechos para comenzar el servicio en la web del servidor, luego cree un grupo de aplicaciones que se ejecute en ese usuario. Tenemos que hacer que su sitio web use ese grupo de aplicaciones. Usando este enfoque, todo el sitio web se ejecutará bajo el usuario que acaba de crear. Si desea que sea más granular, aún puede crear el usuario que tenga los derechos para comenzar el servicio, en lugar de usarlo para el grupo de aplicaciones, puede hacer solo la página que necesita iniciar el servicio que se ejecuta en ese usuario utilizando la impersonación. ¡Puede usar la función de impsonación solo para este método!

Para obtener más detalles, eche un vistazo a los enlaces a continuación:

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top