SACL على الخدمات باستخدام C# || الحصول على مؤشر إلى الخدمة التي لديها ACCESS_SYSTEM_SECURITY حقوق باستخدام C#

StackOverflow https://stackoverflow.com/questions/426295

  •  06-07-2019
  •  | 
  •  

سؤال

أي شخص لديه أي فكرة عن كيفية الحصول على SACL على خدمة التحكم عن بعد باستخدام C# ؟ لقد حاولت العديد من الطرق المختلفة, و في الأساس لا شيء يعمل.يمكنني الحصول على DACL و SACL على الجهاز المحلي ، ولكن الحصول على إما على جهاز بعيد لا يبدو ممكنا.

ما قمت به هو إنشاء فئة تسمى ServiceSecurity أن يرث من NativeObjectSecurity ويعمل الكثير مثل RegistrySecurity فئة.فيما يلي اثنين من المنشئات التي لدي:

public ServiceSecurity(string serviceName, AccessControlSections includeSections)
        : base(true, ResourceType.Service, serviceName, includeSections, null, null)
    {
    }

    public ServiceSecurity(System.Runtime.InteropServices.SafeHandle handle, AccessControlSections includeSections)
        : base(true, ResourceType.Service, handle, includeSections)
    {
    }

أول واحد يستخدم اسم الخدمة ، في حين أن الثانية تتوقع التعامل مع الخدمة.ومن الواضح أن الأول يعمل بشكل جيد للحصول على DACL و SACL لأنه المحلية ، ولكن للحصول على جهاز بعيد, أنا باستخدام ServiceController الفئة تجد الخدمة على الجهاز البعيد.بعد الحصول على ذلك ، فقد مررت ServiceHandle الملكية من الخدمة ServiceSecurity الطبقة لقد بنيت في الحصول على الوصول غير المصرح به الاستثناء الذي لا يبدو صحيحا لأن حساب مستخدم المجال المشرف على المجال المحلي المشرف على مربع الهدف.لدي أيضا SeSecurityPrivilege الحق الذي ينبغي أن يسمح لي بالدخول.

أي شخص لديك أي أفكار ؟ يبدو SafeHandle أنا على الحصول ليس صحيحا ، ولكن SafeHandle خصائص أقول أنه لم يغلق وأنه هو صالح في التعامل معها ، لذا أنا لا أعرف تماما ما يجري.

هنا مدونة أنا باستخدام لمحاولة استرداد البيانات:

ServiceSecurity sSec = new ServiceSecurity(services[i].ServiceName, accessSections);
string outputData = sSec.GetSecurityDescriptorSddlForm(accessSections);

أعلاه سوف تعمل على الأذونات المحلية و إعدادات التدقيق (DACL و SACL هو).لكنه مصمم للعمل على الجهاز المحلي.إذا كنت تفعل هذا بدلا من ذلك:

ServiceSecurity sSec = new ServiceSecurity(services[i].ServiceHandle, accessSections);
string outputData = sSec.GetSecurityDescriptorSddlForm(accessSections);

على ServiceSecurity منشئ فشل على حد سواء المحلية والبعيدة خوادم SACL هي على النحو التالي, ولكن لا يزال يعمل في DACL هو:

System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.
   at System.Security.AccessControl.Win32.GetSecurityInfo(ResourceType resourceType, String name, SafeHandle handle, AccessControlSections accessControlSections, RawSecurityDescriptor& resultSd)
   at System.Security.AccessControl.NativeObjectSecurity.CreateInternal(ResourceType resourceType, Boolean isContainer, String name, SafeHandle handle, AccessControlSections includeSections, Boolean createByName, ExceptionFromErrorCode exceptionFromErrorCode, Object exceptionContext)
   at System.Security.AccessControl.NativeObjectSecurity..ctor(Boolean isContainer, ResourceType resourceType, SafeHandle handle, AccessControlSections includeSections)

بالنسبة accessSections, أنا فقط تحديد واحد من AccessControlSections, سواء المراجعة أو الوصول إلى المراجعة يبدو أن تفشل في كل مرة عندما أكون اجتياز ServiceHandle.


تحديث:لذلك ربما السؤال ينبغي أن يكون حقا ، كيف يمكنني الحصول على مؤشر إلى الخدمة التي لديه ACCESS_SYSTEM_SECURITY حقوق حتى أستطيع الحصول على SACL ؟

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

المحلول

مقبض من ServiceController لن يكون ACCESS_SYSTEM_SECURITY الحقوق بحيث لا يمكن الوصول إلى SACL استخدامه.

من أجل الحصول على هذا الحق سوف تحتاج إلى الحصول على التعامل مع هذا الحق.قد تحتاج إلى استخدام DuplicateHandle للحصول على حقوق إضافية ولكن تمكن SeSecurityPrivilege على النظام البعيد قد تكون خادعة.

هل حاولت استخدام اسمه خدمة منشئ مع البعيد الاسم ؟

سوف تحتاج إلى التحقق من ذلك قليلا و أعود إليك.إذا كان لا أحد أعطى إجابة أفضل غدا سأبحث عن الجواب لك.

تحرير:من اسمه خدمة منشئ أعني محاولة خلق ServiceSecurity كائن مع اسم الخدمة في شكل \\server_name\service_name أو \\IP_address\service_name.من الناحية النظرية يجب أن تعمل ولكن قد لا يرجع ذلك إلى حقيقة أن SeSecurityPrivilege سيتم تمكين على الجهاز المحلي وليس على الجهاز البعيد.

من أجل الحصول على التعامل مع ACCESS_SYSTEM_SECURITY الحق الممنوح يجب اتباع هذه الخطوات:

  • استرداد مقبض (من ServiceController أو من خلال إمكانية التشغيل المتداخل)
  • تمكين SeSecurityPrivilege الحالي رمزية (هذا هو الجزء صعبة) ، انظر: AdjustTokenPrivileges, TOKEN_PRIVILEGES, LUID_AND_ATTRIBUTES, ، وما إلى ذلك.
  • الاتصال DuplicateHandle على التعامل مع الطالب مهما كانت الأذونات التي تحتاجها بما في ذلك ACCESS_SYSTEM_SECURITY لاسترداد جديدة في التعامل مع الحقوق المناسبة.
  • تعطيل SeSecurityPrivilege (على النحو الوارد أعلاه).

للأسف ليس لدي بيئة اختبار إعداد مناسب لاختبار هذا لذلك أنا لا يمكن أن يضمن أنه سوف يعمل على الخدمات عن بعد.التمكين من SeSecurityPrivilege على الملقم البعيد يبدو أن حجر العثرة الرئيسي.على أي حال, آمل أن يساعد هذا إلى حد ما على الأقل.

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