如何在PowerShell中提取AD组成员的纯SamAccountName值
解决PowerShell中AD组成员SamAccountName提取纯字符串的问题
这是因为你用Select SamAccountName得到的是包含单个属性的自定义对象数组,不是纯字符串数组,所以直接索引得到的是对象而非属性值。给你几个可行的解决办法:
方法1:修改原命令直接得到字符串数组(推荐)
用-ExpandProperty参数直接提取属性值,这样$users就是纯字符串的数组,后续索引直接拿到用户名:
$users = Get-ADGroupMember -Identity 'AD-Group-XYZ' -Recursive | Select-Object -ExpandProperty SamAccountName
现在执行$users[0]就会直接输出usernameX了。
方法2:从已有的对象数组中提取属性值
如果已经执行了原命令生成了$users对象数组,直接访问对象的SamAccountName属性即可:
$users[0].SamAccountName
这是最直接的方式,因为每个对象本身就包含这个属性,之前试的.ToString()、.text都不对——对象的默认ToString()会返回对象的表示形式(比如@{SamAccountName=usernameX}),而.text根本不是这个对象的属性。
方法3:用ForEach-Object提取属性
另一种等价的写法是通过管道遍历每个对象,直接取出属性值:
$users = Get-ADGroupMember -Identity 'AD-Group-XYZ' -Recursive | ForEach-Object { $_.SamAccountName }
同样会得到纯字符串数组,效果和方法1一致。
补充说明
为什么原命令会返回对象?Select-Object SamAccountName(简写Select SamAccountName)的作用是创建只包含指定属性的新对象,而不是直接提取属性值。只有加上-ExpandProperty,才会把属性的值“展开”成数组元素,而不是把对象作为数组元素。
内容的提问来源于stack exchange,提问作者aragorn
相关产品推荐
相关产品推荐

