如何让Powershell以逗号分隔输出Get-ADUser -Filter *?

时间:2015-03-13 19:13:29

标签: powershell csv

我有一个简单的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

一些注意事项:

  1. 调用Get-AdUserInfo -Users时,脚本需要在使用-Users参数时输入单个ID,*或用逗号分隔的多个ID。
  2. 使用ConvertTo-CSV解决了我最大的问题,逗号分隔输出,谢谢大家。
  3. 我想摆脱自动创建的标题(“SAMAccountName”,“Name”,“PasswordNeverExpires”,“LockedOut”,“PasswordLastSet”,“$ _。PasswordLastSet.AddDays($ maxPasswordAge)”, “LastLogOnDate”, “CanonicalName”)。我怎样才能做到这一点?我已经尝试过-skip 1但是这不能用于*并且如果使用单个ID或用逗号分隔的ID,则删除所有内容(包括数据)。我不能让-ExpandProperty工作。在最后添加format-table -hidetableheaders也没有做任何事情

2 个答案:

答案 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

Game Changer

所以你通过包含你的功能对你的例子做了一些很大的改动。立即尝试使用此尺寸。

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的功能。

我们会收集数组$resultsEnd块中的所有用户,将其转换为不包含自定义标头的CSV输出。