如何提取powershell中的字段内容
How to extract field content in powershell
历史:我正在制作一个 Powershell 脚本,以便从定义的 table 包含用户列表创建用户并将它们放入定义的 OrganizationalUnit 中。
问题:在脚本的最后,我想要一份报告,以便列出在新创建的帐户中是否有一个或多个用户帐户被禁用
在我的脚本中,我必须为每个用户输入一个密码,但我输入的密码可能不符合 Active Directory 中定义的密码策略;在这种情况下,帐户将被创建但被禁用。
为了继续,我尝试了:
dsquery user "ou=sp,dc=mydomain,dc=local" -disabled
它给我打印了这个:
"CN=user1,OU=SP,DC=mydomain,DC=local"
"CN=user2,OU=SP,DC=mydomain,DC=local"
"CN=user3,OU=SP,DC=mydomain,DC=local"
我的目标:我想在变量中提取 "CN" 字段中的值,以便将它们与脚本中的初始用户 table 进行比较。
dsquery user "dc=mydomain,dc=local" -disabled | where-object {$_.CN -ne $null}
或
dsquery user "dc=mydomain,dc=local" -disabled | where-object {$_.Common-Name -ne $null}
但它没有帮助(不起作用)。请问我该如何进行?
未测试 - 只是 "from my mind"
$csvData = Import-Csv 'UserList.csv' -Delimiter ';' -Encoding UTF8
$userList = dsquery user "ou=sp,dc=mydomain,dc=local" -disabled
$listOfDisabledAccounts = @()
foreach ($user in $userList)
{
if ($csvData.Name -contains (($user -split ',')[0] -replace 'CN=',''))
{
$listOfDisabledAccounts += $csvData.Name
}
}
$listOfDisabledAccounts
dsquery
不是 PowerShell cmdlet,而是可执行文件。这意味着它不会 return PowerShell 对象到管道。 Kongstead 的方法的工作原理是知道它 return 是字符串输出。通过使用 split
和 replace
操作字符串,您可以将输出变成可用于您目的的内容。获取此信息的其他两种方法是使用 AD 模块(来自 RSAT 在桌面操作系统上)和来自 .Net 的 ADSI 方法。这两个都是 return 可直接使用的数据。
AD cmdlet 是最简单的。要获取所有禁用的帐户,将如下所示:
Search-ADAccount -AccountDisabled -SearchBase "dc=mydomain,dc=local"
下面的例子使用PowerShell的match函数来解析CN字段,类似于Kongsted的回答。如果不能使用 AD cmdlet,它应该可以帮助您实现您的目标。
#This is the output from your current query, from the question, it appears to be an array.
$output = ("CN=user1,OU=SP,DC=mydomain,DC=local","CN=user2,OU=SP,DC=mydomain,DC=local","CN=user3,OU=SP,DC=mydomain,DC=local")
$disabledAccs = @()
foreach ($line in $output) {
#match everything after CN= up to the next comma
if([string]$line -match "CN=([^,]*)"){
$disabledAccs += , $Matches[1]
}
}
历史:我正在制作一个 Powershell 脚本,以便从定义的 table 包含用户列表创建用户并将它们放入定义的 OrganizationalUnit 中。
问题:在脚本的最后,我想要一份报告,以便列出在新创建的帐户中是否有一个或多个用户帐户被禁用
在我的脚本中,我必须为每个用户输入一个密码,但我输入的密码可能不符合 Active Directory 中定义的密码策略;在这种情况下,帐户将被创建但被禁用。
为了继续,我尝试了:
dsquery user "ou=sp,dc=mydomain,dc=local" -disabled
它给我打印了这个:
"CN=user1,OU=SP,DC=mydomain,DC=local" "CN=user2,OU=SP,DC=mydomain,DC=local" "CN=user3,OU=SP,DC=mydomain,DC=local"
我的目标:我想在变量中提取 "CN" 字段中的值,以便将它们与脚本中的初始用户 table 进行比较。
dsquery user "dc=mydomain,dc=local" -disabled | where-object {$_.CN -ne $null}
或
dsquery user "dc=mydomain,dc=local" -disabled | where-object {$_.Common-Name -ne $null}
但它没有帮助(不起作用)。请问我该如何进行?
未测试 - 只是 "from my mind"
$csvData = Import-Csv 'UserList.csv' -Delimiter ';' -Encoding UTF8
$userList = dsquery user "ou=sp,dc=mydomain,dc=local" -disabled
$listOfDisabledAccounts = @()
foreach ($user in $userList)
{
if ($csvData.Name -contains (($user -split ',')[0] -replace 'CN=',''))
{
$listOfDisabledAccounts += $csvData.Name
}
}
$listOfDisabledAccounts
dsquery
不是 PowerShell cmdlet,而是可执行文件。这意味着它不会 return PowerShell 对象到管道。 Kongstead 的方法的工作原理是知道它 return 是字符串输出。通过使用 split
和 replace
操作字符串,您可以将输出变成可用于您目的的内容。获取此信息的其他两种方法是使用 AD 模块(来自 RSAT 在桌面操作系统上)和来自 .Net 的 ADSI 方法。这两个都是 return 可直接使用的数据。
AD cmdlet 是最简单的。要获取所有禁用的帐户,将如下所示:
Search-ADAccount -AccountDisabled -SearchBase "dc=mydomain,dc=local"
下面的例子使用PowerShell的match函数来解析CN字段,类似于Kongsted的回答。如果不能使用 AD cmdlet,它应该可以帮助您实现您的目标。
#This is the output from your current query, from the question, it appears to be an array.
$output = ("CN=user1,OU=SP,DC=mydomain,DC=local","CN=user2,OU=SP,DC=mydomain,DC=local","CN=user3,OU=SP,DC=mydomain,DC=local")
$disabledAccs = @()
foreach ($line in $output) {
#match everything after CN= up to the next comma
if([string]$line -match "CN=([^,]*)"){
$disabledAccs += , $Matches[1]
}
}