Добавление объекта ScriptMap с использованием ManagementClasses - PullRequest
2 голосов
/ 21 января 2009

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

Я использую WMI API ManagementClass / ManagementObject (потому что он лучше справляется с удаленным администрированием, чем 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);

Я получаю «Операция недействительна из-за текущего состояния объекта.». С другой стороны, если я просто пытаюсь установить свойство, мне говорят, что свойство не существует. Класс scriptMap имеет путь «ScriptMap», который отображают существующие объекты.

Есть ли у кого-нибудь рабочий код, который манипулирует ScriptMaps с помощью API ManagementClass?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2009

Пример 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();
    }
1 голос
/ 23 апреля 2009

Мне очень трудно создавать объекты WMI с нуля. Проще клонировать () существующий объект, который вы запросили из системы, а затем изменить его. Вот функция, которую я недавно написал для работы с ScriptMaps. Это в Powershell, а не в 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...