PowerShell:如何强制转换为用户对象?

PowerShell:如何强制转换为用户对象?,powershell,casting,active-directory,Powershell,Casting,Active Directory,我有以下代码连接到域中的每台计算机并检查本地administrators组的成员: Foreach ($Computer in Get-ADComputer -Filter *){ $Path=$Computer.Path $Name=([ADSI]"$Path").Name write-host $Name $members =[ADSI]"WinNT://$Name/Administrators" $members = @($members.psbas

我有以下代码连接到域中的每台计算机并检查本地administrators组的成员:

Foreach ($Computer in Get-ADComputer -Filter *){
    $Path=$Computer.Path
    $Name=([ADSI]"$Path").Name
    write-host $Name
    $members =[ADSI]"WinNT://$Name/Administrators"
    $members = @($members.psbase.Invoke("Members"))
    ForEach($member in $members){
        Write-Host $member.GetType().InvokeMember("Name", 'GetProperty', $null, $member, $null)
        Write-Host $member.GetType().InvokeMember("AdsPath", 'GetProperty', $null, $member, $null)
    }
}
我要做的是将$member的值存储在某种形式的$User对象中,这样我就可以在不使用所有疯狂的调用程序的情况下引用属性

e、 g.在Psudo代码中,我想要:

$user = (User) $member;
Write-Host $user.Name
Write-Host $user.AdsPath

我对PowerShell是新手,但是。。。而且我不确定我是否真的理解如何强制转换到其中的对象类型。

是否要创建具有指定成员和值的自定义对象(或
PSObject
):

Foreach($computerin-Get-ADComputer-Filter*){
$Path=$Computer.Path
$Name=([ADSI]“$Path”).Name
写入主机$Name
$members=[ADSI]“WinNT://$Name/Administrators”
$members=@($members.psbase.Invoke(“成员”))
ForEach($members中的成员){
$propsWanted=@('Name','AdsPath')#所需属性的数组
$properties=@{}#这是一个空哈希表或关联数组,用于保存值
foreach($propsWanted中的prop){
$properties[$prop]=$member.GetType().InvokeMember($prop,'GetProperty',$null,$member,$null)
}
$user=新对象PSObject-属性$properties
$user#这是表示用户的对象
}
}
只需回顾一下其中的一些变化:

  • 我将所有您想要的属性名放入一个数组
    $propsWanted
    ,然后迭代该数组以调用并获取每个属性名。通过在单个位置添加属性名称,您可以在以后轻松处理更多属性
  • $properties
    哈希表将存储一个键/值对,其中键是属性名称,值是属性值
  • 填充哈希表后,可以在创建
    PSObject
    时将其传递给
    新对象的
    -Property
    参数
  • 您应该使用新对象,并通过测试以下几件事情来了解:

    • 将其导入
      格式-
      cmdlet以查看各种视图:

      $user |格式表
      $user |格式列表
      
    • 直接检查其属性的值:

      $user.Name
      $user.AdsPath
      
    • 如果创建这些对象的数组,则可以对其进行过滤,例如:

      $user | Where对象{$\.Name-类似于“*Admin”}
      
    选择 您可以尝试使用CIM或WMI,这实际上会更友好一些:

    CIM
    $group=Get CimInstance-ClassName Win32\u group-Filter“Name='Administrators”
    获取CimAssociatedInstance-InputObject$group-ResultClassName Win32\U用户帐户|
    选择-扩展属性标题
    获取CimAssociatedInstance-InputObject$group-ResultClassName Win32\U组|
    选择-扩展属性标题
    
    WMI
    $query=“与{Win32_Group.Domain='$($env:COMPUTERNAME)',Name='Administrators'}关联,其中ResultClass=Win32_UserAccount”
    获取WmiObject-Query$Query | Select-ExpandProperty标题
    $query=“与{Win32_组.域='$($env:COMPUTERNAME)',Name='Administrators'}的关联者,其中ResultClass=Win32_组”
    获取WmiObject-Query$Query | Select-ExpandProperty标题
    
    此方法需要.NET 3.5: 添加类型-AssemblyName System.DirectoryServices.AccountManagement $ctype=[System.DirectoryServices.AccountManagement.ContextType]::计算机 $context=New Object-TypeName System.DirectoryServices.AccountManagement.PrincipalContext-ArgumentList$ctype,$env:COMPUTERNAME $idtype=[System.DirectoryServices.AccountManagement.IdentityType]::SamAccountName $group=[System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($context,$idtype,'Administrators')) $group.Members| 选择@{N='Domain';E={$\ Context.Name},samaccountName
    归属 以上所有备选方案都直接取自这篇“嘿,脚本编写者!”文章。它详细介绍了所有这些,包括
    [ADSI]
    方法。值得一读

    如何实际施法 我只是意识到我并没有真正回答这个问题,即使这不是你所需要的。类/类型用方括号指定。事实上,当你这么做的时候:

    [ADSI]“WinNT://$Name/Administrators”
    
    您将
    [String]
    中的字符串文字)强制转换为
    [ADSI]
    对象,该对象之所以有效,是因为
    [ADSI]
    知道如何处理它

    其他例子:

    [int]“5”
    [System.Net.IPAddress]'8.8.8.8'
    

    因为我们不知道您正在寻找的“用户”对象的类型(或者它甚至没有真正加载),所以您不能使用此方法。

    哇,这肯定会起作用,但真的没有标准的“用户”对象吗“为了在默认情况下拥有所有属性,可以将哪些对象强制转换为?实际上,这里使用的是COM对象,这让这一切有点奇怪。可能有这样一个东西,但它似乎是隐藏的,或者我不知道在使用
    [ASDI]
    对象时如何获得它。我为您添加了一些备选方案,一个更详细地解释它们的链接。你一定要看看这个链接。谢谢!我去看看!我也刚刚意识到我从来没有告诉过你铸造是如何工作的,所以现在也有了。