用于检查AD中用户状态的Powershell脚本

用于检查AD中用户状态的Powershell脚本,powershell,active-directory,Powershell,Active Directory,用于检查用户帐户状态的Powershell脚本使用具有名称(名字和姓氏)的文本文件启用或禁用 我正在尝试从用户列表(使用powershell的文本文件)中找出是否在AD中启用或禁用了用户帐户 我试图获取代码,从文本文件中的用户列表中提取姓名,并检查他们的帐户是否在AD中启用或禁用。但下面的代码给出了错误消息 Get-Content -Path users.txt | ForEach-Object { Get-ADUser -LDAPFilter "(samaccountname=$_)" | S

用于检查用户帐户状态的Powershell脚本使用具有名称(名字和姓氏)的文本文件启用或禁用

我正在尝试从用户列表(使用powershell的文本文件)中找出是否在AD中启用或禁用了用户帐户

我试图获取代码,从文本文件中的用户列表中提取姓名,并检查他们的帐户是否在AD中启用或禁用。但下面的代码给出了错误消息

Get-Content -Path users.txt |
ForEach-Object {
Get-ADUser -LDAPFilter "(samaccountname=$_)" |
Select-Object -Property samaccountname,enabled
}
我认为这与samaccountname有关,因为我只有简单文本格式的名称(firstname lastname)。

如果您的列表是“firstname lastname”格式,您可以尝试以下方法:

$ResultList = Get-Content -Path users.txt | ForEach-Object {
    Get-ADUser -LDAPFilter "(anr=$_)" | Select-Object -Property samaccountname,enabled
}
$ResultList | Export-Csv -Path C:\temp\Results.csv -NoTypeInformation 

如果文本文件中的名称与广告用户的DisplayName属性相比较,则可以执行以下操作:

# read the text file as an array of strings
$userNames = Get-Content -Path users.txt
# get the list of users where the DisplayName property corresponds to an item in the array.
# since the DisplayName property is not returned by Get-ADUser by default, we have to specify
# what properties we need returned here.
Get-ADUser -Filter * -Properties DisplayName, SamAccountName, Enabled | 
Where-Object { $userNames -contains $_.DisplayName } |
Select-Object -Property SamAccountName, Enabled
如果您不确定与DisplayName属性对应的名称,那么将值拆分为first和lastname可能是另一种想法:

# read the textfile and create an array of objects with properties FirstName and LastName.
Get-Content -Path D:\users.txt | 
Select-Object @{Name = 'FirstName'; Expression = {($_ -split ' ',2)[0].Trim()}},
              @{Name = 'LastName';  Expression = {($_ -split ' ',2)[1].Trim()}} |
ForEach-Object {
    $user = Get-ADUser -Filter "GivenName -eq '$($_.FirstName)' -and Surname -eq '$($_.LastName)'" -ErrorAction SilentlyContinue
    if ($user) {
        $user | Select-Object -Property SamAccountName, Enabled
    }
}

如果users.txt仅包含名字和姓氏列表,请使用空格分隔,您可以执行以下操作:

switch -Regex -File users.txt {
    '^(\S+)\s(.*)$' { 
        Get-ADUser -Filter "GivenName -eq '$($Matches[1])' -and Surname -eq '$($Matches[2])'" |
            Select-Object SamAccountName,Enabled
    }
}
这利用了switch语句,这通常比在文件上使用
Get Content
并对每个管道对象处理
Foreach对象
更有效

^(\S+)\S(.*)$
是一个正则表达式字符串<代码>\S+是一个或多个连续的非空格字符<代码>\s是一个空格字符<代码>*为零个或多个连续字符<代码>^与行首匹配<代码>$与行尾匹配。每个匹配项都存储在自动变量
$Matches
中。在字符周围使用
()
创建捕获组,可以从
$Matches
集合中检索捕获组
$Matches[1]
是组1(名字不带空格),而
$Matches[1]
是组2(姓氏:第一个空格后的所有内容)

如果一行与正则表达式字符串不匹配,则该行将被忽略



严格地说,在命令性能方面,包含除
*
以外的查询的
-Filter
几乎总是比仅依赖
Where Object
更快。然而,有一点是,一个
Get-ADUser-Filter*
查询在时间上比数千个更快的
Get-ADUser-Filter“samaccountname-eq‘data’”查询更高效。我希望这是有意义的。

是否
users.txt
包含samAccountName的列表?错误消息到底是什么?使用会使它很可能为每个帐户找到多个匹配项。这可能是可接受的,也可能是不可接受的,这取决于要求。这也取决于输入数据的准确性。由手术室决定。不,甚至不是那样。ANR将返回部分匹配。文档描述了它是如何做到这一点的。假设您的组织中有一个“约翰·詹姆斯”和一个“詹姆斯·约翰逊”。如果您搜索
(anr=John James)
,它将同时返回这两个数据,即使您的输入数据是准确的,并且只有一个数据是完全匹配的。我并不是说不应该使用anr。这只是OP需要注意的事情。我如何将其导出为CSV格式?获取内容-Path users.txt | ForEach对象{Get ADUser-LDAPFilter“(anr=$|)”|选择对象-属性samaccountname,启用|导出csv“Results.csv”}但是它不起作用。你使用的正则表达式不能将姓氏与两个或两个以上的单词匹配,例如
Pepe Ay y Olé
。名字也可能有同样的问题。应该使用更好的分隔符来处理该问题。如果我们只关心姓氏空格,那么第二个捕获组可能会变成
*