特定所有者的Powershell列表文件

时间:2014-07-08 04:10:31

标签: powershell powershell-v2.0 powershell-v3.0

初学者。 如何修改此脚本以列出特定用户拥有的文件,而不是列出每个文件。例如,我只想查看用户john doe拥有的文件。

Set-StrictMode -Version Latest $files = Get-ChildItem foreach($file in $files) {$owner=(Get-Acl $file).Owner $file | Add-Member NoteProperty Owner $owner $file}

非常感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

尝试这样的事情:

$files = Get-ChildItem | Select *,@{n='Owner';e={(Get-Acl $_).Owner}} | 
             Where {!$_.PSIsContainer -and ($_.Owner -eq 'Domain\name')}

在V3上,您可以将其简化为:

$files = Get-ChildItem -File | Select *,@{n='Owner';e={(Get-Acl $_).Owner}} | 
             Where {$_.Owner -eq 'Domain\name'}

答案 1 :(得分:0)

这可能会更快:

$Owner = 'user1'
$SID = (Get-ADUser $Owner).sid

Get-ChildItem | 
where { (Get-Acl $_).sddl -like "O:$SID*" } |
select *,@{l='Owner';e={$Owner}} 

ACL存储为SDDL字符串。文件所有者的SID将始终位于SDDL字符串的开头,前缀为O:。 NTFS必须将SID解析为所有者名称。为SID执行字符串匹配所需的时间比执行查找所需的时间少,然后匹配名称。它并不多,只是做一个文件或10只会有很大的不同,但是当你开始做成千上万的文件时,它就会加起来。

答案 2 :(得分:0)

我发现的最简单的是:

Get-ChildItem | Get-Acl | Where-Object { $_.Owner -match 'Domain\username' }

答案 3 :(得分:0)

另一个变体,但使用.NET的File.GetAccessControl https://docs.microsoft.com/en-us/dotnet/api/system.io.file.getaccesscontrol?view=netframework-4.8而不是Get-Acl cmdlet。

贷记Get File Owner/Author

Get-ChildItem <path> -File | Select-Object fullname, LastAccessTime, LastWriteTime, CreationTime, @{N='Owner';E={$_.GetAccessControl().Owner}}