Почему методы COM-объекта не видны / недоступны в powershell? - PullRequest
0 голосов
/ 20 февраля 2020

Как описано здесь , COM-объекты могут быть созданы с использованием New-Object -ComObject ProgID.

. С помощью тех же шагов мы можем создать COM-объект с ProgID wscAPI.WSCProductList.1. Но мы видим, что нет доступных методов, в то время как по документам здесь мало. Почему эти методы не показаны / недоступны в powershell?

PS C:\>$Wsc = New-Object -ComObject wscAPI.WSCProductList.1
PS C:\>$Wsc | Get-Member
TypeName: System.__ComObject

Name                      MemberType Definition
----                      ---------- ----------
CreateObjRef              Method     System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
Equals                    Method     bool Equals(System.Object obj)
GetHashCode               Method     int GetHashCode()
GetLifetimeService        Method     System.Object GetLifetimeService()
GetType                   Method     type GetType()
InitializeLifetimeService Method     System.Object InitializeLifetimeService()
ToString                  Method     string ToString()

PS: здесь приведен пример кода для доступа к этим методам с использованием C ++ здесь .

ОС: Microsoft Windows 10 Предприятие

1 Ответ

1 голос
/ 21 февраля 2020

Ну, по сути, PowerShell не является браузером COM-объектов. COM-объекты загружаются только при их создании и вызове.

PowerShell основан на. Net, а. Net является частью операционной системы и загружается при запуске ОС. По этой причине вы получаете пространства имен. Net в IntelliSense в PowerShell без дополнительной работы. Хотя даже с этим нужно правильно его назвать. Например,

[System.Net.Dns]::

… или если вы хотите, если вам не нужно что-либо печатать, вы можете поместить это…

Using Namespace System.Net

в самый верх вашего профиля / ваш сценарий или первое, что вы добавите в интерактивную сессию, тогда вы можете просто

[Dns]::

Об использовании Это позволяет вам указать, какие пространства имен используются в сеанс.

COM не будет доступен для вас таким образом. Что касается вашего указателя кода C ++. Вы можете использовать внешние сегменты кода / блоки / функции в PowerShell, чтобы дополнить то, что вы, возможно, пытаетесь сделать, и для этого используется командлет Add-type .

Примеры ---

Использование кода CSharp (C#) в скриптах Powershell

Как отмечено онлайн:

из PS запустите help add-type -full и найдите пример F # (пример 7 в моей системе). Предполагая, что у вас есть компилятор C ++, который следует модели «CodeDom», вы можете отразить пример F #.

Кроме того, PowerShell может вызывать неуправляемый код с помощью P / Invoke (это концепция. NET). ), поиск в Интернете вариантов использования.

Итак, основываясь даже на том, что вы показываете, вы говорите за пределами этого?

$wscAPI = New-Object -ComObject wscAPI.WSCProductList.1
$wscAPI.CreateObjRef(

... Итак, вы хотите быть в состоянии сказать, что IntelliSense / табуляция завершены, когда вы начинаете вводить

New-Object -ComObject #[tab if on the command line or IntelliSense popup in an editor]

Тем не менее, существуют модули / скрипты и т. д. c. через Microsoft powershellgallery.com продемонстрируйте, как вы можете написать свой собственный объектный браузер. См. Ресурсы ниже:

Браузер объектов PowerShell

Это приложение PowerShell, которое отображает объекты в приложении типа проводника, написанном в PowerShell. В обозревателе объектов PowerShell отображаются свойства и дочерние объекты / коллекции для любого объекта платформы PowerShell /. Net. Для объяснения того, как использовать это

Загрузить: PSObjectBrowser.ps1

Существует несколько WMI, CIM,. Net примеров / инструментов, которые показывают, как сделать просмотр объекта, но опять же, что. Net. Просто ищи их. Например:

Браузер объектов PowerShell

Это приложение PowerShell, которое отображает объекты в приложении типа проводника, написанном в PowerShell. Браузер объектов PowerShell отображает свойства и дочерние объекты / коллекции для любого объекта каркаса PowerShell /. Net. Для объяснения того, как использовать это

Загрузить: PSObjectBrowser.ps1

Сценарий выходного дня: WMI Explorer Tool

Сценарий выходного дня: Объявление WMI Explorer 2.0

Надстройка PowerShell ISE - CIM Explorer

Надстройка PowerShell ISE для навигации по CIM (WMI) ) пространства имен / определения и создание примеров сценариев PowerShell с помощью командлетов CIM

Бесплатный WMI Explorer, WMI Tools & Powershell GUI Builder

Coretech WMI и PowerShell Browser

· Мощный инструмент WMI, позволяющий подключаться и работать с WMI локально и удаленно. С помощью этого инструмента вы можете просматривать пространства имен WMI, классы, методы, свойства и экземпляры классов. Помимо того, что это браузер WMI, Coretech WMI и PowerShell Explorer позволяют также экспортировать результаты запросов и методы пространств имен.

Они могут дать вам идеи относительно того, как вы можете создать такой для COM. Тем не менее, вам нужно знать все возможные классы COM (зарегистрированные или нет), которые вы хотите создать. Таким образом, вы можете сделать что-то вроде этого, чтобы найти их ...

Get-ChildItem -Path 'HKLM:\Software\Classes' -ErrorAction SilentlyContinue | 
Where-Object {$PSItem.PSChildName -match '^\w+\.\w+$' -and
(Get-ItemProperty "$($PSItem.PSPath)\CLSID" -ErrorAction SilentlyContinue)} | 
Format-Table PSChildName -AutoSize

# Results
<#
Sample output from the COM lookup.

PSChildName                                              
-----------                                              
...                                          
Access.Application                                       
...                                        
AcroPDF.PDF                                              
...                                          
AudioVBScript.1                                          
...                                          
CDO.Message                                              
...                        
Cmiv2.CmiFactory                                         
...                                                          
Excel.Application                                        
...                                         
InternetExplorer.Application                             
...                                         
Outlook.Application                                      
...                                             
Paint.Picture                                            
...
#>

Можно, конечно, изменить регулярное выражение, чтобы найти любую строку (ы), которую они выбирают. Для получения подробных инструкций по использованию регулярных выражений см. Ресурс "Регулярные выражения".

RegExLib.com Шпаргалка регулярных выражений (. NET)

Regular -Expressions.Info Tutorials

Итак, с этим блоком, скажем, это усилие ...

New-Object -ComObject #[tab if on the command line or IntelliSense popup in an editor]

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

Function Get-AllCimClassesAsVariables
{
    # Set variables for CimClasses
    ForEach($Item in ((Get-CimClass -ClassName *).CimClassName))
    {Set-Variable -Name $Item -Value $Item}
}

Обратите внимание:

Я больше не использую этот подход, потому что он громоздок, имеет большую загрузочную загрузку, потому что ему придется заполнять этот список при каждом сеансе PowerShell.

У меня есть полная Visual Studio на моей рабочей станции (можно также использовать платную или бесплатную версию ), поэтому я использую ее для разработки PowerShell, а также для ссылок и просмотра COM ресурсы.

До этого я использовал OleView.exe из Windows / MSOffice SDK . Был также набор Windows ресурсов, которые можно было бесплатно скачать. У меня все еще есть это в облачном расположении для моего легкого доступа, прикрепленное к моей панели задач, когда мне просто нужно это против раскручивания Visual Studio или когда я нахожусь в месте, где у меня нет Visual Studio под рукой.

Чтобы сделать то, что вам нужно, было бы разумно просто использовать OleVIew.exe как часть вашего набора инструментов PowerShell для поиска и использования информации COM, найти те, которые вы будете регулярно использовать, и поместить их в модуль, который вы регулярно загружаете через свой профиль, или вам нужно будет собрать все, что вам нужно для просмотра, аналогично тому, что показано для инструментов WMI / CIM /.Net выше.

...