2010-05-18 2 views
1

Je peux créer un IISWebVirtualDir ou IISWebVirtualDirSetting avec WMI, mais je n'ai trouvé aucun moyen de transformer le répertoire virtuel en une application IIS. Le répertoire virtuel veut AppFriendlyName et un chemin. C'est facile parce qu'ils font partie de l'objet Setting. Mais pour transformer le répertoire virtuel en App, vous devez définir AppIsolated = 2 et AppRoot = [sa racine].Création d'un répertoire virtuel IIS 6 avec PowerShell v2 sur WMI/ADSI

Je ne peux pas faire cela avec WMI. Je préfère ne pas mélanger ADSI et WMI, donc si quelqu'un peut m'entraîner pour que cela se produise dans WMI, je serais très heureux.

Voici mon code de démonstration:

$server = 'serverName' 
$site = 'W3SVC/10/ROOT/' 
$app = 'AppName' 
# If I use these args, the VirDir is not created at all. Fails to write read-only prop 
# $args = @{'Name'=('W3SVC/10/ROOT/' + $app); ` 
# 'AppIsolated'=2;'AppRoot'='/LM/' + $site + $app} 
# So I use this single arg 
$args = @{'Name'=($site + $app)} 
$args # Look at the args to make sure I'm putting what I think I am 
$v = set-wmiinstance -Class IIsWebVirtualDir -Authentication PacketPrivacy ` 
    -ComputerName $server -Namespace root\microsoftiisv2 -Arguments $args 
$v.Put() 
# VirDir now exists 

# Pull the settings object for it and prove I can tweak it 
$filter = "Name = '" + $site + $app + "'" 
$filter 
$v = get-wmiobject -Class IIsWebVirtualDirSetting -Authentication PacketPrivacy ` 
    -ComputerName $server -Namespace root\microsoftiisv2 -Filter $filter 
$v.AppFriendlyName = $app 
$v.Put() 
$v 
# Yep. Changes work. Goes without saying I cannot change AppIsolated or AppRoot 

# But ADSI can change them without a hitch 
# Slower than molasses in January, but it works 
$a = [adsi]("IIS://$server/" + $site + $app) 
$a.Put("AppIsolated", 2) 
$a.Put("AppRoot", ('/LM/' + $site + $app)) 
$a.Put("Path", "C:\Inetpub\wwwroot\news") 
$a.SetInfo() 
$a 

Toute pensée?

Mise à jour avec le code de travail

$server = 'serverName' 
$site = 'W3SVC/11/ROOT/' 
$app = 'AppName' 
$path = "c:\inetpub\wwwroot\news" 

$args = @{'Name'=($site + $app)} 
$v = set-wmiinstance -Class IIsWebVirtualDir -Authentication PacketPrivacy 
    -ComputerName $server -Namespace root\microsoftiisv2 -Arguments $args 
$v.AppCreate2(2) 


$filter = "Name = '" + $site + $app + "'" 
$v = get-wmiobject -Class IIsWebVirtualDirSetting -Authentication PacketPrivacy 
-ComputerName $server -Namespace root\microsoftiisv2 -Filter $filter 
$v.AppFriendlyName = $app 
$v.Path = $path 
$v.Put() 

Merci Garrett et Glenn.

+0

Un autre pleurnicher WMI. WMI ne fournit aucune propriété sur les propriétés pour identifier facilement si cette propriété est héritée. ADSI en fait un simple booléen. J'adorerais le faire en WMI pur, mais ils ne le rendent pas facile. – codepoke

+1

Ha! Je ne savais pas. Soupir. Lorsque vous créez un objet à l'aide de WMI, l'héritage est simplement époustouflé. WMI introduit toutes les propriétés héritées et les écrit dur dans le nouvel objet. La métabase gonfle comme la fille violette de Willie Wonka. La propriété ADSI IsInherit, cependant, n'est pas un cakewalk à trouver. Je peux finir par avoir à marcher parent/enfant pour éviter de créer des accessoires mieux hérités. Charmant. – codepoke

Répondre

1

Ce n'est pas testé, mais que diriez-vous quelque chose le long de ces lignes:

$appCreateParams = $v.PSBase.GetMethodParameters("AppCreate2") 
$appCreateParams["AppMode"] = 2 

$v.PSBase.InvokeMethod("AppCreate2", $appCreateParams, null) 
+0

Garett, votre code ne fonctionnait pas du tout, mais vous m'a convaincu de chercher la méthode AppCreate2 dans le doc WMI, et il était là. Cela me regardait depuis le début. La réponse réelle était aussi simple que $ v.AppCreate2 (2), et maudit mes yeux pour m'avoir à nouveau échoué. :-) Merci! – codepoke

+0

InvokeMethod devrait fonctionner, mais la syntaxe peut être un peu éteinte. Peu importe, je suis content d'apprendre que vous avez trouvé une solution. – Garett

1

Il semble que la commande AppCreate2 vous manque? http://arcware.net/creating-iis-applications-with-powershell/

+0

Glenn, le lien que vous avez fourni a montré la méthode AppCreate2 appelée sur un objet ADSI. Cela m'a décontenancé (étant facilement distrait et tout. :-)) WMI fournit la même méthode, cependant, et ça marche bien. – codepoke

Questions connexes