ManagementClassesを使用してScriptMapオブジェクトを追加する
質問
すでに関連する質問をしましたが、残念ながら、答えは正しいものの、実際には私の問題を解決しませんでした。
ManagementClass / ManagementObject WMI APIを使用しています(DirectoryEntry APIよりもリモート管理の方が優れているため)。
から既存のスクリプトマップを完全に削除したい一般的な文字列形式のソリューションを使用すると、VBSでは機能するようですが、ManagementClass APIでは機能しないようです。そのため、スクリプトマップオブジェクトの正しい配列を作成するようなものを作成しようとしています。たとえば、
foreach (var extension in extensions) {
var scriptMap = scriptMapClass.CreateInstance();
SetWmiProperty(scriptMap, "ScriptMap.Extensions", "." + extension);
残念ながら、関数SetWmiPropertyを実装することは不可能のようです。次のことを試みた場合
wmiObject.Properties.Add(propertyName, CimType.SInt32);
I get <!> quot;オブジェクトの現在の状態により、操作は無効です。<!> quot;。一方、プロパティを設定しようとすると、プロパティが存在しないと通知されます。 scriptMapクラスには、パス<!> quot; ScriptMap <!> quot;があります。これは、既存のオブジェクトが表示するものです。
ManagementClass APIを使用してScriptMapsを操作する作業コードはありますか?
解決
WMIオブジェクトをゼロから作成するのは非常に難しいと思います。システムから照会した既存のオブジェクトをClone()する方が簡単で、それを変更します。 ScriptMapsを処理するために最近作成した関数を次に示します。 C#ではなくPowershellにありますが、考え方は同じです:
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
}
}
他のヒント
Richard Bergによって概説された手法の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();
}
所属していません StackOverflow