【发布时间】:2017-09-09 02:21:59
【问题描述】:
我有以下代码来生成机器上本地管理员组的成员列表:
param([string]$server)
$localGroupArray =@()
$groupName = 'Administrators'
$Group = [ADSI]"WinNT://$Server/$groupName,group"
$Members = @($Group.psbase.Invoke("Members"))
[Array]$class = $members | Foreach {$_.GetType().InvokeMember("Class", 'GetProperty', $null, $_, $null)}
[Array]$MemberNames = $Members | ForEach-Object {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
这按预期工作,但如果它是域组,我需要了解有关对象的更多信息,例如域。所以我想列出我可以使用 InvokeMember 查询的所有属性,但我找不到好的解决方案。
使用 Get-Member 等常规方法不起作用,因为这是一个 system._com 对象。以下是 Comobject 上 Get_member 的输出:
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.ObjectInitializeLifetimeService()
ToString Method string ToString()
我也尝试过看看是否可以找到 c# 解决方案并能够找到此链接:How return the type of a System.__COMObject in System.Type in C#
但是,当我尝试在 comobect 上运行 GetProperties 时,我编写的程序没有得到任何 PropertyDescription。如果需要,我也可以发布 c# 代码,但我觉得这有点离题,因为我只使用 Powershell 标签发布。
【问题讨论】:
-
什么版本的 PowerShell/Windows?在最近的版本中,这只是
Get-LocalGroupMember -Group "Administrators"(要获取远程计算机的列表,请使用Invoke-Command -ComputerName $server远程命令),这样就省去了使用 WinNT 提供程序的所有麻烦。 -
使用
[ADSI]加速器的本地用户或域用户是不会得到的。就我个人而言,当我在一个盒子上有管理员时,我使用 WMI 来获取域,但这并不能真正解决您在 COMObject 上枚举属性的问题。
标签: powershell