Powershell输出

时间:2013-01-10 19:17:22

标签: powershell

从一些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”?

3 个答案:

答案 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") }