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

我认为你一直在思考。尝试查看对象。并过滤 - 使用 where,而不是选择字符串。例如:

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

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

这应该让你开始......?:)

于 2013-01-10T19:27:50.843 回答
0

也尝试将其添加-Expand到 IdentityReference。以您正在做的事情为基础:

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 回答