无法从某些 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 命令的输出呢?如何在没有额外数据的情况下“grep”任何以 DOM 开头的行?
最佳答案
这应该为您提供域中所有用户的访问对象
$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 some }
编辑:只是作为一个想法。如果您只想要与文件夹同名的用户没有访问规则的文件夹(不检查用户拥有什么样的权限),您可以尝试:
$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”没有任何访问权限)。
关于Powershell输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14265590/