如何在Powershell中结合Get-ADComputer创建LDAP查询的例外列表

时间:2015-10-15 08:49:19

标签: powershell scripting ldap

我有一个脚本可以搜索域中的所有计算机,并提取有关它们的详细信息并将其显示在报告中。

    ipmo ActiveDirectory  ;
    $ADSearchBase = "DC=contoso,DC=chelu,DC=ro,DC=com"  


        write-host 
        write-host "Preparing your data..."
        write-host 

$AD_Results = Get-ADComputer -filter '(Enabled -eq $true)' -SearchScope Subtree -SearchBase $ADSearchBase -properties Description, PasswordNeverExpires, LastLogonTimeStamp, PasswordLastSet, operatingSystem, operatingSystemServicePack, whenCreated, distinguishedname, canonicalname
$count = $AD_Results.count
"Analyzing $count machines..."

# MAIN LOOP

ForEach ($Result In $AD_Results)
{
        $i++ 
        if ($i % 16 -eq 0)  { $i }

        $ComputerName=$result.name
        $OS = $result.operatingSystem
        $DESC =  $result.Description
        $DN =  $result.distinguishedname

        $PNE = $result.passwordneverexpires

        if  ($ComputerName.Length -ge 15)
         {
            $ComputerName = $ComputerName.substring(0,15)
         }


     ## BEGIN TIME CONVERSIONS
        $LLTS = 0       #AD LastLogonTimestamp
        $PLS = 0        #AD PasswordLastSet

         If ($result.lastLogonTimeStamp -eq $Null)
          {
            $T = [Int64]0
          }
          Else
          {
            $T = [DateTime]::FromFileTime([Int64]::Parse($result.lastlogontimestamp)).ToString("dd/MM/yyyy HH:mm:ss")  
          }
               $LLTS = $T 

       $WCR = $result.whencreated.ToString("dd/MM/yyyy HH:mm:ss")


          If (!($result.passWordLastSet -eq $Null))
          {
               $PLS = $result.passwordLastSet.ToString("dd/MM/yyyy HH:mm:ss")
          }
      ## END TIME CONVERSIONS


# 1/2 is in Exceptions?

        if ($DN -match "Domain Controllers") {"$computername : DOMAIN CONTROLLER -> Skipping..." ; $Skipped++ ; continue}
        if ($DN -match "HVCL") {"$computername : Virtual Cluster Name -> Skipping..." ; $Skipped++ ; continue}  


        #2/2: isWin? 

         if ($result.operatingSystem -notlike '*windows*') 
         {
          $Skipped++
          continue
         }

          $isServer=0
         if (($DN -match "Servers") -or ($result.operatingSystem -like '*server*')) 
          {$isServer=1}

该脚本正在根据其DN(可分辨名称)跳过某些机器,因为它可以在中看到 "#1/2是例外?"并在"#2/2:isWin?"

同时我收到了一个用户的请求,除了一些其他(额外)机器,这些机器无法使用AD中的初始查询进行排序,这是:

$AD_Results = Get-ADComputer -filter '(Enabled -eq $true)' -SearchScope Subtree -SearchBase $ADSearchBase -properties Description, PasswordNeverExpires, LastLogonTimeStamp, PasswordLastSet, operatingSystem, operatingSystemServicePack, whenCreated, distinguishedname, canonicalname

基本上,用户想要从报告中除了一些特定的机器(机器1,机器2,机器3),这些机器不是真正的计算机帐户,而是“连接点”#34;对于群集资源。现在,有两种方法可以做到这一点:

  1. 使用脚本查找所有这些"连接点"对于群集资源。检测CNO和VCO的唯一方法是查看"服务主体名称"来自计算机对象的属性。如果你发现" MSClusterVirtualServer"然后该对象是CNO或VCO

    以下是我能想到的:

    $serviceType="MSClusterVirtualServer"
    $spns = @{}
    $filter = "(servicePrincipalName=$serviceType/*)"
    $domain = New-Object System.DirectoryServices.DirectoryEntry
    $searcher = New-Object System.DirectoryServices.DirectorySearcher
    $searcher.SearchRoot = $domain
    $searcher.PageSize = 1000
    $searcher.Filter = $filter
    $results = $searcher.FindAll()
    foreach ($result in $results){
    $account = $result.GetDirectoryEntry()
    foreach ($spn in $account.servicePrincipalName.Value){
    if($spn.contains("$serviceType/")){
    $spns[$("$spn`t$($account.samAccountName)")]=1;
    }
    }
    }
    $spns.keys | sort-object
    
  2. 实际创建"白名单"或者"黑名单"在哪里按名称包含计算机,假设将来某些其他用户可能会提出类似的请求,除了显示在报告中的计算机,并且这些最后的计算机可能不是虚拟群集。我更喜欢这种方法。我所做的是创建一个LDAP过滤器来查找3台特定的机器。这是:

        (&(&(&(objectCategory=computer)(objectClass=computer)(|(cn=machine1)(cn=machine2)(cn=machine3)))))
    
  3. 问题:你能帮我把一个IF条款放在一起,它会指向白名单"在csv格式中,它将包含要从报告中排除的机器的名称列表?白名单应驻留在脚本所在的同一文件夹中。我应该使用上面的LDAP过滤器吗?我该怎么做?

1 个答案:

答案 0 :(得分:0)

根据您的$AD_Result,我会尝试这些方法:

ForEach ($exception In (Get-Content "exceptions.txt")) {
   $AD_Result = $AD_Result | ? { $_.Name -ine $exception }
}

为什么要用csv格式的例外文件?