2

いくつかのPowerShellコマンドから必要な出力を取得するのに問題があります。ホームディレクトリのクリーンアップに役立つPowerShellスクリプトを作成しています。ディレクトリのアクセス許可を取得し、ディレクトリの名前とアクセス権を持つユーザーが一致していることを確認する必要があります。

Get-Acl関数を使用していますが、追加のデータがたくさんあります。理論的には、これらのディレクトリのファイル権限には所有者として管理者が必要であり、アクセスの下にリストされているのはユーザーだけである必要があります。

PS C:\> Get-Acl "\\fs1\home\e55555"
Directory: \\fs1\home
Path                       Owner                      Access
----                       -----                      ------
e55555                    BUILTIN\Administrators     DOM\e55555 Allow ...

アクセスしているものを除いて、すべてを除外したいと思います。配管してみました| [アクセス]を選択しますが、同じ出力が得られません。

UserID以外にも追加情報があるので、ファイルに書き込んで必要なものを「grep」してみることができると思いました。グーグルと実験を通して、解析しやすいと感じた出力が得られました。コマンドと出力は次のとおりです。

PS C:\> $test = Get-Acl \\fs1\home\\e55555 | Select-Object -ExpandProperty Access
 | select IdentityReference

IdentityReference
-----------------
DOM\e55555
NT AUTHORITY\SYSTEM
BUILTIN\Administrators
NT AUTHORITY\Authenticated Users

正規表現を使用して目的の行を見つけようとしましたが、試したもののどれも出力を提供しませんでした。以下のコマンドのさまざまなバリエーションを試し、変数の代わりにファイルを解析してみました。

echo $test | Select-String -pattern "^DOM"
[regex]::matches($test,"^DOM")

では、get-aclコマンドで出力を削減するにはどうすればよいですか?また、追加のデータなしでDOMで始まる行を「grep」するにはどうすればよいですか?

4

3 に答える 3

2

これにより、ドメイン内のすべてのユーザーにアクセスオブジェクトが提供されます。

$path = "\\fs1\home\\e55555"
(Get-Acl $path).Access | where { $_.IdentityReference -like "DOM*"}

ユーザーがそこにいることを確認したい場合は、次を使用できます。

$path = "\\fs1\home\\e55555"
$username = $path | Split-Path -Leaf

(Get-Acl $path).Access | where { $_.IdentityReference -like "DOM\$username"}

Identityreference権限を確認する場合はアクセスオブジェクト全体が必要なので、プロパティを抽出しませんでした。Get-Acl出力を変数(例)に保存する$access = Get-Acl ......と、ユーザーがアクセスルールを持っていることを確認できます。if($access) { do something }

編集:アイデアと同じように。フォルダと同じ名前のユーザーがアクセスルールを持たないフォルダのみが必要な場合(ユーザーがどのような権限を持っているかを確認せずに)、次のことを試すことができます。

$acls = Get-ChildItem "\\fs1\home\" | Get-Acl 
foreach ($acl in $acls) {
    $users = $acl.Access | select -ExpandProperty IdentityReference
    $username = $acl.PSChildName
    if ($users -notcontains "DOM\$username") { $username }
}

これにより、何かが間違っている(例:ユーザー "e55555"がフォルダー"e55555"にアクセスできない)フォルダー名の配列(例: "e55555")が出力されます。

于 2013-01-10T19:27:31.770 に答える
0

私はあなたが考えると思います-常にひも。代わりにオブジェクトを表示してみてください。そしてフィルタリングするには-select-stringではなくwhereを使用します。例えば:

$HomeDrive = '\\fs1\home\'
$User = 'e55555'

(Get-Acl $HomeDrive$User).Access |
    where { $_.IdentityReference -match $user }

それで始められるはずです...?:)

于 2013-01-10T19:27:50.843 に答える
0

-ExpandIdentityReferenceにも追加してみてください。あなたがやっていたことに基づいて構築するには:

Get-Acl "\\fs1\home\\e55555" | Select-Object -ExpandProperty Access | 
    select -expand IdentityReference | ?{ $_.StartsWith("DOM") }

簡単にするには:

(Get-Acl "\\fs1\home\\e55555").Access | Select -Expand IdentityReference | ?{ $_.StartsWith("DOM") }
于 2013-01-10T19:28:49.643 に答える