我有一个简单的Powershell脚本,我想用它来获取AD中的所有用户并显示特定的属性。这是我的剧本的核心:
$id = "*"
Get-ADUser -Filter {SAMAccountName -like $id} -Properties * | Select-Object -Property SAMAccountName,Name,PasswordNeverExpires,LockedOut,PasswordLastSet,LastLogOnDate,CanonicalName
完整脚本有一个输入参数来设置$ id,这样它就可以是一个ID,一个ID列表(例如“bsmith,jdoe,gmanning”),或*来获取所有帐户。
这是我的问题:使用时,*,我需要以逗号分隔输出。
以下是捕获:输出不能是CSV文件 - 或任何其他类型的文件。
原因是我正在编写此脚本以用于N-Enable的N-Central监控软件套件。您不需要知道N-Central来帮助解决我的问题,只需了解N-Central使用自己的软件在客户端上运行Powershell脚本并将结果返回到无法更改为csv文件的txt文件中(或者以任何其他方式格式化,而不是硬编码的方式。
这意味着我的结果必须是显示在屏幕上或变量中的结果(例如$ results = Get-ADUser -Filter * ....)。我无法输出任何类型的文件,这会将Export-CSV作为选项。
我尝试过其他类型的格式无效(例如使用-f)。问题似乎与Powershell使用*通配符抓取所有AD用户的方式有关。它似乎把它们全部作为一个大对象,所以我无法让我的输出在所有属性之间有一个逗号,以便我得到逗号分隔的输出。因此,当我从N-Central返回结果作为.txt文件时,所有数据都存在,但是我之间的属性中没有逗号,然后在Excel中以逗号分隔打开.txt文件(或制表符分隔符。
有没有人有一个解决方案可以让我格式化Get-ADUser -filter *以便逗号分隔而不使用export to file?
更新:好的,我以为我没有发布我的完整脚本让事情变得简单,但似乎我做了相反的事情。所以,下面是我的完整脚本。任何人都应该能够运行它来查看结果:
function Get-ADUserInfo
{
[CmdletBinding()]
param(
#[Parameter(Mandatory=$True)]
[string[]]$Users= '*'
)
Begin {
$maxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.Days
$Headers="ID, Name, Password Never Expires?, Locked Out, Password Last Set, Expiry Date, Last Logon Date, OU Path"
}
Process {
foreach ($id in $Users)
{
$results=Get-ADUser -Filter {SAMAccountName -like $id} -Properties * | select -property SAMAccountName,Name, PasswordNeverExpires,LockedOut,PasswordLastSet,(@{Expression={$_.PasswordLastSet.AddDays($maxPasswordAge)}}), LastLogOnDate,CanonicalName | `
ConvertTo-CSV -NoTypeInformation
}
}
End {
$Headers
$results
}
}
Get-ADUserInfo -Users
一些注意事项:
答案 0 :(得分:0)
$id = "*"
$userlist = Get-ADUser -Filter {SAMAccountName -like $id} -Properties SAMAccountName,Name,PasswordNeverExpires,LockedOut,PasswordLastSet,LastLogOnDate,CanonicalName | ConvertTo-CSV -NoTypeInformation
$ userlist将是以CSV格式行存储的用户数组
编辑:组合-Properties * |选择[propertyylist]并摆脱所有属性的拉动。
编辑:包含-NoTypeInformation,以便输出为纯CSV。
注意:应该对过滤器做些什么。
答案 1 :(得分:0)
所以你可以使用这样的东西
$props = "SAMAccountName","Name","PasswordNeverExpires","LockedOut","PasswordLastSet","LastLogOnDate","CanonicalName"
$results = Get-ADUser -Filter * -Properties $props | Select $props | ConvertTo-Csv -NoTypeInformation
这使用$props
数组使实际查询可读并强制执行属性顺序。默认情况下会返回大多数属性,例如samaccountname
,因此不需要指定它们但不会造成任何损害。
$results
将包含带引号的逗号分隔输出。如果引号打扰您,则应使用简单的-replace
$results = $results -replace '"'
<强>除了强>
正如其他人所说,你在浪费时间使用-Properties *
,你应该只返回你需要的属性。这也是我使用$props
的原因。
从评论中更新
如果要删除标题列,只需输出-Skip
即可。在填充结果的代码末尾添加Select-Object
$results = Get-ADUser -Filter * -Properties $props | Select $props | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1
为了覆盖您计算的属性,我到目前为止找到的最简单的方法是添加另一个Select-Object
。不是我想要的方式,但现在它有效。
$results = Get-ADUser -Filter * -Properties $props |
Select $props | Select-Object *,@{L="pWD";Expression={$_.PasswordLastSet.AddDays($masPasswordAge)}} |
ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1
所以你通过包含你的功能对你的例子做了一些很大的改动。立即尝试使用此尺寸。
function Get-ADUserInfo
{
[CmdletBinding()]
param(
#[Parameter(Mandatory=$True)]
[string[]]$Users= '*'
)
Begin{
$results = @()
$maxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.Days
$Headers= @{Label="ID";Expression={$_.SAMAccountName}},
@{Label="Name";Expression={$_.Name}},
@{Label="Password Never Expires?";Expression={$_.PasswordNeverExpires}},
@{Label="Locked Out";Expression={$_.LockedOut}},
@{Label="Password Last Set";Expression={$_.PasswordLastSet}},
@{Label="Expiry Date";Expression={$_.PasswordLastSet.AddDays($maxPasswordAge)}},
@{Label="Last Logon Date";Expression={$_.LastLogOnDate}},
@{Label="OU Path";Expression={$_.CanonicalName}}
}
Process{
foreach ($id in $Users){
$results += Get-ADUser -Filter {SAMAccountName -like $id} -Properties PasswordNeverExpires,LockedOut,PasswordLastSet,LastLogOnDate,CanonicalName | select $Headers
}
}
End{
$results | ConvertTo-CSV -NoTypeInformation
}
}
Get-ADUserInfo -Users
$Headers=
包含一系列计算属性,其中大多数都是标题更改。它不需要这样做,你可以在输出内容之前手动添加一个标题行。但是,此解决方案更符合PowerShell的功能。
我们会收集数组$results
和End
块中的所有用户,将其转换为不包含自定义标头的CSV输出。