إضافة كائن تعيين البرنامج النصي باستخدام ManagementClasses

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

  •  19-08-2019
  •  | 
  •  

سؤال

ولقد طلبت بالفعل مسألة ذات صلة، ولكن للأسف الإجابات، في حين صحيح، لم يكن في الواقع حل مشكلتي.

وأنا باستخدام API ManagementClass / ManagementObject WMI (لأنه الأفضل في التعامل مع الإدارة عن بعد من API DirectoryEntry). أود أن إزالة الخرائط النصي الموجود من

وعن طريق يبدو الحل تنسيق سلسلة مشترك للعمل من أجل VBS، ولكن ليس لAPI ManagementClass. لذلك، لقد كنت أحاول أن أكتب شيئا من شأنها أن تخلق مجموعة الصحيحة من الأشياء خريطة النصي منها مثلا.

    foreach (var extension in extensions) {
        var scriptMap = scriptMapClass.CreateInstance();
        SetWmiProperty(scriptMap, "ScriptMap.Extensions", "." + extension);

ولسوء الحظ، فإنه لا يبدو ممكنا لتنفيذ SetWmiProperty وظيفة. إذا كنت تحاول ما يلي

wmiObject.Properties.Add(propertyName, CimType.SInt32);

وأحصل على "عملية غير صالحة بسبب الحالة الحالية للكائن". من ناحية أخرى، إذا كنت مجرد محاولة لتعيين الخاصية، والحصول قيل لي أن الخاصية غير موجود. الطبقة تعيين البرنامج النصي لديها مسار "تعيين البرنامج النصي"، وهو ما عرض الكائنات الموجودة.

هل لديها أي رمز العمل التي تعالج البرامج النصية باستخدام API ManagementClass؟

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

المحلول

وأجد أنه من الصعب جدا لإنشاء كائنات WMI من الصفر. أسهل لاستنساخ () كائن موجود كنت قد استفسر من النظام ومن ثم تعديله. وهنا وظيفة كتبت مؤخرا للتعامل مع البرامج النصية. انها في بوويرشيل، وليس C #، ولكن الفكرة هي نفسها:

function Add-AspNetExtension
{
    [CmdletBinding()]
    param (
        [Parameter(Position=0, Mandatory=$true)]
        [psobject] $site  # IIsWebServer custom object created with Get-IIsWeb
        [Parameter(ValueFromPipeline=$true, Mandatory=$true)]
        [string] $extension
    )

    begin 
    {
        # fetch current mappings
        # without the explicit type, PS will convert it to an Object[] when you use the += operator
        [system.management.managementbaseobject[]] $maps = $site.Settings.ScriptMaps

        # whatever the mapping is for .aspx will be our template for mapping other things to ASP.NET
        $template = $maps | ? { $_.Extensions -eq ".aspx" }
    }

    process
    {
        $newMapping = $template.Clone()
        $newMapping.Extensions = $extension
        $maps += newMapping
    }

    end
    {
        $site.Settings.ScriptMaps = $maps
    }
}

نصائح أخرى

وA C # مثال على هذه التقنية التي حددها ريتشارد بيرغ.

static void ConfigureAspNet(ManagementObject virtualDirectory, string version, string windowsLocation, IEnumerable<string> extensions)
    {
        var scriptMaps = virtualDirectory.GetPropertyValue("ScriptMaps");
        var templateObject = ((ManagementBaseObject[])scriptMaps)[0];
        List<ManagementBaseObject> result = new List<ManagementBaseObject>();
        foreach (var extension in extensions) {
            var scriptMap = (ManagementBaseObject) templateObject.Clone();
            result.Add(scriptMap);
            if (extension == "*")
            {
                scriptMap.SetPropertyValue("Flags", 0);
                scriptMap.SetPropertyValue("Extensions", "*");
            } else
            {
                scriptMap.SetPropertyValue("Flags", 5);
                scriptMap.SetPropertyValue("Extensions", "." + extension);
            }
            scriptMap.SetPropertyValue("IncludedVerbs", "GET,HEAD,POST,DEBUG");
            scriptMap.SetPropertyValue("ScriptProcessor",
                string.Format(@"{0}\microsoft.net\framework\{1}\aspnet_isapi.dll", windowsLocation, version));
        }
        virtualDirectory.SetPropertyValue("ScriptMaps", result.ToArray());
        virtualDirectory.Put();
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top