문제

내 웹 사이트 (ASP.NET/C7에서 작성) 중 MDeraters가 특정 서비스를 시작할 수 있기를 원합니다. 내가 가진 코드는 다음과 같습니다.

    ServiceController svcController = new ServiceController("InvidualFileConversion");

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

이제 실행하면 추가 메시지가 "컴퓨터에서 InvidualFileConversion 서비스를 열 수 없습니다"라는 오류가 발생합니다.

나는 이것이 사용 권한에 문제가있는 것을 알고 있지만, 적절한 권한을 어떻게 주는가? 내가 쓸 수있는 대답과 함께 오지 마십시오. 나는 그것을 시도하고 그것이 작동하지 않았습니다. 또한이 몇 줄의 코드에 대해 필요할 때 전체 웹 사이트를 위해 이것을 완전히 설정하는 가장 좋은 방법이 아닙니다.

편집 : 이 코드를 내 코드에 추가했으며 여전히 작동하지 않습니다. 같은 장소에서 동일한 예외를 얻습니다. 이제 다음과 같이 보입니다 :

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

다음과 같이 보이는 가장되는 클래스가 있습니다.

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

유효성 검사는 작동하지만 문제가 해결되지는 않습니다. 나는 여전히 권한에 문제가있는 것 같지 않다. 이것을 변경하기 위해 무엇을해야합니까?

편집 2 : 다음 단계를 포함하는 다음 단계 :

  1. ID가 사용자에게 설정된 앱 풀 (관리자 그룹의 멤버)입니다.
  2. 동일한 사용자에게 서비스 "로그온"을 설정합니다.
  3. 웹 응용 프로그램을 다시 실행 한 후에도 여전히 실패합니다 ..
  4. 그러나 관리자 계정을 코드의 자격 증명으로 넣으면 작동합니다. (앱 풀 및 서비스에서 관리자를 사용하지 않았지만 ...) < / P>

    다른 단어에서는 관리자 계정으로 원하는 것을 얻을 수 있지만 나 자신을 만든 계정이 아니며 관리자 권한이 있습니다. 나는 아직도 사용자와 함께이 작업을하고 싶습니다. 관리자 자격 증명을 사용할 수 있도록 안전하지 않다고 생각하는 것으로 생각했습니다.

    Sidenote의 경우, 관리자 권한이 있지만 'Administrator'- 계정이 아닌 계정이 없습니다.

    편집 3 : 이것은 이상하게되고 있습니다. 나는 지금 일하는 것 같지만 : - 가장 방법이 없으면 (작동하지 않음). - 방금 Rob이 말했던 것을했습니다. 나는 사용자가 정의한 사용자가있는 내 자신의 응용 프로그램 풀이 있습니다. Windows 서비스에는 사용자가 지정한 사용자가 있습니다. (사용자가 수신 한 서비스로 로그온하십시오) - 이와 함께 작동하는 것 같습니다. - 그러나 내 웹 사이트를 통해 디버그를 통해 나는 아직도 Acces가 거부당했습니다. 그러나 브라우저와 IP를 통해 웹 사이트에 액세스하는 경우 서비스를 시작할 수 있습니다.

    합계를 입력하십시오. - 가장 방법은 작동하지 않습니다. - 서비스에 사용자가 지정한 경우 Server 사용자가 작동하는 경우 SELF 생성 된 APP 풀을 사용하면됩니다. 그러나 디버그 모드에서는 작동하지 않습니다 (여전히 거부 된 Acces).

    이 게시물이 크게 지내고 있고 여전히 그것을 읽는지 궁금해합니다. 그러나 아직도 누군가가 내게 어떤 세부 사항을 제공 할 수 있습니까? 나는 그것이 미래의 어딘가에 다시 실패 할 것입니다 ..

    모든 의견을 알 수 있습니다! 플로리

도움이 되었습니까?

해결책

서비스를 시작할 수있는 충분한 사용자 아래에서 웹 사이트가 실행되고 있는지 확인해야합니다. IIS에서 익명 인증이 비활성화되었음을 확인하십시오. 좋은 방법은 서버 웹에서 서비스를 시작할 수있는 권한을 가진 사용자를 만들 수 있습니다. 해당 사용자로 실행되는 응용 프로그램 풀을 만듭니다. 웹 사이트에서 해당 응용 프로그램 풀을 사용해야합니다. 이 접근 방식을 사용하면 모든 웹 사이트가 만드는 사용자 아래에서 실행됩니다. 더 세분화 된 경우 서비스를 시작할 권한이있는 사용자를 만들 수 있지만 응용 프로그램 풀에 사용하는 대신 사용자가 impersonation을 사용하여 해당 사용자 아래에서 서비스를 시작 해야하는 페이지 만 만들 수 있습니다. 이 메소드에서만 imporsonation 기능을 사용할 수 있습니다!

자세한 내용은 아래의 링크를 살펴보십시오.

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top