6

コンピューターが持つ可能性のある特定のプロパティに基づいてコンピューターのリストを生成するスクリプトを作成しようとしています。たとえば、WindowsXPコンピューターとWindows7コンピューターのリストを作成し、それらの名前を.csvファイルに入れて、それぞれの最終的な数を出力しようとしています。

これがこれまでの私のコードです

import-module ActiveDirectory
$computers = get-adcomputer -Filter 'ObjectClass -eq "Computer"' -properties "OperatingSystem"
$i = 0
$j = 0
Foreach ($computer in $computers) {
    if ($computer.operatingSystem -like "Windows 7*") {
        $i++
        '"{0}","{1}","{2}"' -f $computer.Name, $computer.OperatingSystem, "$computer.DistinguishedName" | Out-file -append C:\users\admin\desktop\test.txt
        }
    elseif ($computer.OperatingSystem -like "Windows XP*") {
        $j++
        '"{0}","{1}","{2}"' -f $computer.Name, $computer.OperatingSystem, "$computer.DistinguishedName" | Out-file -append C:\users\admin\desktop\test.txt
        }
    else {
        $_
        }

}
write-host "$i Win 7"
write-host "$j Win xp"
$k = $i+$j
write-host "$k Total"

サンプル出力:

104 Win 7
86 Win xp
190 Total

このスクリプトは機能しますが、どのOUを調べないかを指定できるようにすることで、少し改善したいと思いますが、完全には理解できません。

誰かがこれを行う方法について何か洞察を持っているなら、あるいは単に上記のコードをもっと良くするためにさえ、私はそれを聞いてみたいです。

ありがとうございました!

4

2 に答える 2

9

演算子は、DistinguishedNameのワイルドカードを使用-likeしていないようです。したがって、明らかな操作Get-ADComputer -Filter {(DistinguishedName -notlike "*OU=evil,*")}は機能しません。

最も簡単な回避策は、すべてのコンピューターをコレクションに入れ、後でニーズに合わせてフィルター処理することです。そのようです、

# All the computers from the evil OU:
$evilOU = $computers| ? {$_.DistinguishedName -like "*ou=evil,*"}
# All the computers but the ones from the evil OU:
$goodOU = $computers| ? {$_.DistinguishedName -notlike "*ou=evil,*"}

補遺

一致するルールを組み合わせるには、とを使用-and -or-likeます。*でワイルドカードを使用することを忘れないでください? (where-object)

# All the computers save the ones from evil and wicked OU:
$goodOU = $computers| ? {
  $_.DistinguishedName -notlike "*ou=evil,*" -and $_.DistinguishedName -notlike "*ou=wicked,*"

}

于 2012-07-18T07:25:09.570 に答える
2

すべてのコンピューターを収集した後のフィルタリングに問題はありませんが、データを1つのOUに制限するより効率的な方法は、GET-ADCOMPUTERコマンドで-searchbaseスイッチを使用することです。また、オブジェクトタイプをフィルタリングしてコンピューターを指定していることにも気付きました。これは、get-adcomputer cmdltがすでに他のオブジェクトタイプをフィルターで除外しているため、少し冗長です。

私はあなたのコードを取り、それを少し修正しました。

import-module ActiveDirectory
$computers = get-adcomputer -Filter * -properties "OperatingSystem" -SearchBase "OU=evil,OU=workstations,DC=cs,DC=domain,DC=net"
$i = 0
$j = 0
Foreach ($computer in $computers) {
    if ($computer.operatingSystem -like "Windows 7*") {
        $i++
        '"{0}","{1}","{2}"' -f $computer.Name, $computer.OperatingSystem, "$($computer.DistinguishedName)" | Out-file -append C:\users\admin\desktop\test.txt
        }
    elseif ($computer.OperatingSystem -like "Windows XP*") {
        $j++
        '"{0}","{1}","{2}"' -f $computer.Name, $computer.OperatingSystem, "$($computer.DistinguishedName)" | Out-file -append C:\users\admin\desktop\test.txt
        }
    else {
        $_
        }

}
write-host "$i Win 7"
write-host "$j Win xp"
$k = $i+$j
write-host "$k Total"

上記の例は、以前のスクリプトセーブと同じように機能するはずですが、邪悪なOU内にあるWindows7またはxpのいずれかを持つすべてのコンピューターを列挙します。これは、ds.Domain.NetドメインのワークステーションOU内にあります。

また、識別名の各列の末尾に「.DistinguishedName」が追加されていることにも気付いたと思います。これは、$ computer.DistinguishedName式が引用符で囲まれている間は完全に評価されていないため、次の変更で簡単に解決できます。 :

"$computer.DistinguishedName"

"$($computer.DistinguishedName)"

「$(<...>)」構文は、出力を文字列に変換する前に、角かっこ内の完全な式を評価するようにPowerShellに指示します。

于 2014-01-09T21:15:35.413 に答える