使用具有名称(名字和姓氏)的文本文件来启用或禁用用于检查用户帐户状态的Powershell脚本
我正在尝试从用户列表(是使用Powershell的文本文件)中找出是在AD中启用还是禁用了用户帐户。
我尝试获取代码以从文本文件中的用户列表中获取名称,并检查其帐户是否在AD中启用或禁用。但是下面的代码给出了错误消息。
Get-Content -Path users.txt |
ForEach-Object {
Get-ADUser -LDAPFilter "(samaccountname=$_)" |
Select-Object -Property samaccountname,enabled
}
我认为这与samaccountname有关,因为我只具有简单文本格式的名称(名姓)。
答案 0 :(得分:0)
如果您的列表采用“名字的姓氏”格式,则可以尝试以下操作:
$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
答案 1 :(得分:0)
如果文本文件中的名称与AD用户的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属性对应的名称,也许将值分为名字和姓氏可能是另一种想法:
# 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
}
}
答案 2 :(得分:0)
提供的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-Object
效率更高。
^(\S+)\s(.*)$
是一个正则表达式字符串。 \S+
是一个或多个连续的非空格字符。 \s
是一个空格字符。 .*
是零个或多个连续字符。 ^
与行首匹配。 $
与行尾匹配。每个匹配项都存储在自动变量$Matches
中。在字符周围使用()
会创建捕获组,可以从$Matches
集合中检索捕获组。 $Matches[1]
是组1(没有空格的名字),$Matches[1]
是组2(姓:第一个空格之后的所有字符)。
如果一行与正则表达式字符串不匹配,则该行将被忽略。
严格说说命令性能,包含-Filter
以外的查询的*
几乎总是比仅依靠Where-Object
更快。但是,有时会出现一个Get-ADUser -Filter *
查询比数千个更快的Get-ADUser -Filter "samaccountname -eq 'data'"
查询更快的效率。我希望这是有道理的。