如何提取powershell中的字段内容

How to extract field content in powershell

在我的脚本中,我必须为每个用户输入一个密码,但我输入的密码可能不符合 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"

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 是字符串输出。通过使用 splitreplace 操作字符串,您可以将输出变成可用于您目的的内容。获取此信息的其他两种方法是使用 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]
    }
}