从一些powershell命令获取我想要的输出时遇到问题。我正在创建一个powershell脚本来帮助清理主目录。我需要获取目录的权限,并确保directoy的名称和具有访问权限的用户匹配。
我正在使用Get-Acl功能,它有很多额外的数据。理论上,这些目录上的文件权限应该是Administrators作为所有者,用户应该是Access下列出的唯一人员。
PS C:\> Get-Acl "\\fs1\home\e55555"
Directory: \\fs1\home
Path Owner Access
---- ----- ------
e55555 BUILTIN\Administrators DOM\e55555 Allow ...
我想过滤除了访问权限之外的所有内容。我试过管道|选择Access但它不会给我相同的输出。
我知道除了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”?
答案 0 :(得分: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 }
}
这应该输出一个foldernames数组(例如“e55555”),其中有错误的地方(例如用户“e55555”无法访问文件夹“e55555”)。
答案 1 :(得分:0)
我认为你一直在思考字符串。尝试查看对象。并过滤 - 使用where,而不是select-string。 E.g:
$HomeDrive = '\\fs1\home\'
$User = 'e55555'
(Get-Acl $HomeDrive$User).Access |
where { $_.IdentityReference -match $user }
那应该让你开始......? :)
答案 2 :(得分: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") }