Вопрос

на моем сайте (написано в ASP.Net/C#) Я хочу, чтобы модераторы могли начать определенную услугу. Код у меня есть для этого:

    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 на компьютере», с дополнительным сообщением: «ACCES запрещено».

Я знаю, что это проблема с разрешениями, но Как я могу дать себе правильные разрешения? Не приходите с ответом, где я должен написать: Потому что я попробовал, и это не сработало. Также я думаю, что это не лучший способ установить это на весь сайт, когда мне просто нужно для этих нескольких строк кода.

Редактировать: Я добавил это в моем коде, и он все еще не работает, я получаю то же исключение в том же месте. Теперь это выглядит так:

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. Создание приложенного пула, где идентификатор устанавливается для пользователя (который является элементом группы администратора).
  2. Установите сервис «Войти» в тот же пользователь.
  3. После запуска веб-приложения еще раз, он все еще не удается ..
  4. Однако Если я положил в учетную запись администратора как учетные данные в коде, он работает .. (Хотя я не использовал администратор в пуле приложения и на сервис ...) < / P >.

    Другими словами, я могу получить то, что я хочу с учетной записью администратора, но не с учетом я создал себя и имею права администратора. Я все еще хочу сделать эту работу с пользователем, который я сделал себе, как я думаю, это не так безопасно, чтобы поставить ваши учетные данные администратора доступны.

    на Sidenote, на сервере, на котором я работаю, у меня есть учетная запись, имеющая привилегии администратора, но не является «учетной записью администратора».

    <Сильные> Изменить 3: Это странно. Я, кажется, сейчас работаю, но: - Без метода олицвоения (он не работал). - Я только что сделал то, что сказал Роб. У меня есть свой собственный бассейн приложений с пользователем, который я определен. Сервис Windows имеет этот пользователь также. (Пользователь получил вход в качестве права на сервис) - С этим, кажется, работает. - Но если отладка через мой веб-сайт, я все еще получаю аксессуары отказано. Но если только что Acces My веб-сайт через браузер и его IP я могу запустить сервис.

    Чтобы суммировать его: - Подвеска метода не работает. - Просто использование самостоятельного создания приложений приложений с пользователем CORLECT работает, если у сервиса пользователь также указан. Но это не работает в режиме отладки (все еще запрещены там).

    Этот пост попадает в большой, и мне интересно, действительно ли это действительно чтение этого .. Но, возможно, еще кто-то может предоставить мне любые детали? Боюсь, это потерпеть неудачу снова где-то в будущем ..

    Любой комментарий будет оценен! Флорис

Это было полезно?

Решение

Вы должны убедиться, что ваш веб-сайт работает под пользователем, у которого достаточно права начать службу. Убедитесь, что анонимная аутентификация отключена на IIS Хорошим способом может быть создать пользователя, у которого есть права на начальный сервис на веб-сервере, затем создайте пул приложений, который работает под этим пользователем. Затем вы должны сделать веб-сайт использовать этот пул приложения. Используя этот подход, все веб-сайт будет работать под пользователем, который вы только что создаете. Если вы хотите быть более гранулированным, вы все равно можете создать пользователя, имеющие права на запуск сервиса, но вместо этого используют его для пула приложений, вы можете сделать только страницу, которая должна запускать службу, запускаемую под этим пользователем, используя невероятную. Вы можете использовать функцию осистения только для этого метода!

Для более подробной информации о взгляде на ссылки ниже:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top