2013-01-10 57 views
2

无法从某些PowerShell命令获取我想要的输出。我正在创建一个PowerShell脚本来帮助清理主目录。我需要获得目录的权限,并确保directoy的名称和有权访问的用户匹配。Powershell输出

我使用Get-Acl函数,它有很多额外的数据。理论上这些目录上的文件权限应该以管理员作为所有者,用户应该是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命令?我怎么能“grep”的任何行开始与DOM没有额外的数据?

回答

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"} 

我没有” t提取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”)。

+0

非常感谢您!能够得到你需要的代码。当我在PowerShell中看到你的代码是面向对象的,而且我只需引用该属性时,是一个很大的帮助。 – zjherner

0

我觉得你一直在思考。尝试看到对象。并筛选 - 使用where,而不是select-string。例如:

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

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

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

+0

(带有数组输出的命令)。只能使用PS 3.0功能 –

+0

对不起,但您在哪里看到数组输出? Get-Acl SingleFolder返回单个ACL对象。 :) – BartekB

+0

ofc。这是真的=)我的坏 –

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