PowerShell:如何强制转换为用户对象?
我有以下代码连接到域中的每台计算机并检查本地administrators组的成员: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
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”}
$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]
对象时如何获得它。我为您添加了一些备选方案,一个更详细地解释它们的链接。你一定要看看这个链接。谢谢!我去看看!我也刚刚意识到我从来没有告诉过你铸造是如何工作的,所以现在也有了。