Разница между 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 . Почему у второго отсутствуют данные?

2
задан 10 May 2017 в 04:08
2 ответа

Посмотрим:

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

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

3
ответ дан 3 December 2019 в 10:35

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

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

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

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

    > $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
1
ответ дан 18 December 2019 в 19:07

Теги

Похожие вопросы