Назад | Перейти на главную страницу

Разница между Get-IISSite и Get-ChildItem iis: \\ sites

Мне интересно, может ли кто-нибудь объяснить мне разницу в поведении, которую я наблюдаю.

Я пытаюсь найти физический путь к сайту IIS.

Этот образец работает, правильно возвращая PhysicalPath

Import-Module WebAdministration
Get-ChildItem iis:\\sites | Select PhysicalPath

Этот образец не работает. PhysicalPath возвращается как ноль / пустой.

Get-IISSite | select PhysicalPath

Если я прав, оба образца должны возвращать Microsoft.Web.Administration.Site объект. Почему у второго отсутствуют данные?

Посмотрим:

Get-ChildItem iis: \ sites | get-Member | Где имя -подобный р * | Имя объекта сортировки

    TypeName: System.Object

 Name          MemberType   Definition
 ----          ----------   ----------
 password      NoteProperty string password=
 physicalPath  NoteProperty string physicalPath=C:\inetpub\wwwroot
 PSChildName   NoteProperty string PSChildName=Default Web Site
 PSDrive       NoteProperty PSDriveInfo PSDrive=IIS
 PSIsContainer NoteProperty bool PSIsContainer=True
 PSParentPath  NoteProperty string PSParentPath=WebAdministration::\\SANKNIGHT\Sites
 PSPath        NoteProperty string PSPath=WebAdministration::\\SANKNIGHT\Sites\Default Web Site
 PSProvider    NoteProperty IIsProviderInfo PSProvider=WebAdministration

Get-IISSite | get-Member

    TypeName: Microsoft.Web.Administration.Site

 Name                       MemberType            Definition
 ----                       ----------            ----------
 ApplicationDefaults        Property              Microsoft.Web.Administration.ApplicationDefaults ApplicationDefault...
 Applications               Property              Microsoft.Web.Administration.ApplicationCollection Applications {get;}
 Attributes                 Property              Microsoft.Web.Administration.ConfigurationAttributeCollection Attri...
 Bindings                   Property              Microsoft.Web.Administration.BindingCollection Bindings {get;}
 ChildElements              Property              Microsoft.Web.Administration.ConfigurationChildElementCollection Ch...
 Delete                     Method                void Delete()

у него нет членов, начинающихся с P, и гораздо меньше членов, чем Get-ChildItem. Вы можете видеть, что это разные объекты.

При использовании Get-ChildItem каждый провайдер дает подсказки о том, что следует отображать. Думаю, это в:

$pshome\Modules\WebAdministration\iisprovider.format.ps1xml

из-за этого добавляется вся дополнительная информация.

Вышеприведенный ответ правильный, но он казался запутанным. Короче говоря, они возвращают разные типы объектов.

Надеюсь, это лучше иллюстрирует:

$PSDriveThing = Get-ChildItem IIS:\Sites\
$IISSiteThing = Get-IISSite

Оба объекта являются массивами, но их содержимое сильно различается, и объект get-iisSite return не отображает объект PhysicalPath на верхнем уровне. Итак, когда вы select для чего-то, чего не существует, вы создаете пустой массив.

    > $PSDriveThing

    physicalPath
    ------------
    %SystemDrive%\inetpub\wwwroot
    D:\web\OurPortalWeb\site

    > $IISSiteThing
    PhysicalPath
------------

Теперь вместо этого получите фактические объекты IIS:

> $IISSiteThing = Get-IISSite
> $IISSiteThing

Name             ID   State      Physical Path                  Bindings
----             --   -----      -------------                  --------
Default Web Site 1    Stopped    %SystemDrive%\inetpub\wwwroot  http *:80:
                                                                net.msmq localhost
                                                                msmq.formatname localhost
                                                                net.pipe *

OurPortalWeb    2    Started    D:\web\OurPortalWeb\site        https *:443:portal-test2.contoso.com sslFlags=None

Есть два сайта, значит, два объекта, поэтому мы возьмем первый с индексом массива 0:

>$IISSiteThing[0]
Name             ID   State      Physical Path                  Bindings
----             --   -----      -------------                  --------
Default Web Site 1    Stopped    %SystemDrive%\inetpub\wwwroot  http *:80:
                                                                net.msmq localhost
                                                                msmq.formatname localhost
                                                                net.pipe *
                                                                net.tcp 808:*

И когда вы развернете объект, вы найдете множество подузлов и информации в Microsoft.Web.Administration.ConfigurationElement, пока в конце концов вы не обнаружите, что хотите:

> $IISSiteThing[0].Applications[0].VirtualDirectories[0].PhysicalPath
%SystemDrive%\inetpub\wwwroot

Один из способов выбрать только физические пути по вашему желанию:

> Get-IISSite | % {$_.Applications} | % {$_.VirtualDirectories} | % {$_.PhysicalPath}
%SystemDrive%\inetpub\wwwroot
D:\web\OurPortalWeb\site