سؤال

على موقع (مكتوب في ASP.NET/C#) أريد moderaters أن تكون قادرا على بدء تشغيل خدمة معينة.مدونة أنا من أجل هذا:

    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. إنشاء تجمع التطبيق حيث الهوية هي مجموعة المستخدم (الذي هو عضو في مجموعة "المسؤول").
  2. تعيين خدمة "تسجيل الدخول" إلى نفس المستخدم.
  3. بعد تشغيل التطبيق على شبكة الإنترنت مرة أخرى ، فإنه لا يزال يفشل..

ومع ذلك إذا وضعت في حساب المسؤول كما التفويض في القانون, وهو يعمل..(على الرغم من أنني لم تستخدم مسؤول في تجمع التطبيق و الخدمة...)

وبعبارة أخرى, أنا يمكن أن أحصل على ما أريد مع مدير الحساب ، ولكن ليس مع حساب أنا خلقت نفسي و لديه حقوق المسؤول.أنا لا تزال ترغب في جعل هذا العمل مع المستخدم أنني قدمت نفسي كما أعتقد أنها ليست آمنة جدا لوضع بيانات اعتماد المسؤول المتاحة.

على sidenote على الخادم الذي أعمل على علي حساب له امتيازات المسؤول ولكن ليس 'المسؤول'في الحساب.

تحرير 3: هذا غريب.لا يبدو أن العمل الآن ولكن:- دون الانتحال طريقة (لم يعمل).- لقد فعلت ما وقال روب.لدي بلدي تجمع التطبيق مع المستخدم تعريف.خدمة windows له أن المستخدم المحدد كذلك.(المستخدم تلقى بتسجيل الدخول إلى خدمة الحق) - مع هذا ، يبدو أن العمل.- ولكن إذا كان التصحيح من خلال موقع الويب الخاص بي أنا لا يزال الحصول على الق نفى.ولكن لو كان مجرد الق موقع الويب الخاص بي من خلال المتصفح و ايبي لا يمكن بدء تشغيل الخدمة.

وباختصار:- الانتحال الطريقة لا تعمل.- فقط باستخدام النفس إنشاء تجمع التطبيق مع currect على المستخدم يعمل إذا كانت الخدمة للمستخدم أيضا تحديد.لكنه لا يعمل في وضع التصحيح (لا يزال الق نفى).

هذا المنصب هو الحصول على كبيرة وأنا أتساءل عما إذا كان أي لا يزال يقرأ حقا..ولكن ربما لا يزال شخص يمكن أن توفر لي مع أي تفاصيل ؟ أخشى أنه سوف تفشل مرة أخرى في مكان ما في المستقبل..

أي تعليق سيكون موضع تقدير!Floris

هل كانت مفيدة؟

المحلول

لديك للتأكد من أن موقع الويب الخاص بك يعمل تحت المستخدمين الذين لديهم ما يكفي من اليمين لبدء تشغيل الخدمة.تأكد أيضا أن المصادقة المجهولة المعوقين على IIS وسيلة جيدة يمكن إنشاء مستخدم لديه حقوق لبدء الخدمة على ملقم ويب ثم إنشاء تجمع تطبيقات التي يتم تشغيلها ضمن هذا المستخدم.ثم لديك لجعل موقع الويب الخاص بك استخدام هذا التطبيق بركة.باستخدام هذا النهج كل موقع على شبكة الإنترنت سوف تعمل تحت المستخدم لديك مجرد خلق.إذا كنت تريد أن تكون أكثر دقة لا يزال بإمكانك إنشاء المستخدم أن يكون لديك حقوق لبدء الخدمة ولكن بدلا من استخدامها تجمع التطبيق يمكنك جعل الصفحة فقط التي تحتاج إلى بدء تشغيل خدمة تحت هذا المستخدم باستخدام التمثيل.يمكنك استخدام imporsonation الميزة الوحيدة لهذا الأسلوب!

لمزيد من التفاصيل إلقاء نظرة على الروابط أدناه:

http://forums.asp.net/t/1137962.aspx/1

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top