Я написал сценарий Powershell v3 для вывода списка всех файлов, принадлежащих пользователю на нашем файловом сервере. Он работал в течение 3 часов, прежде чем я остановил его. Он должен пройти через 619 238 файлов и 57 452 папки (517 ГБ). Какого порядка это должно быть? Есть ли способ улучшить скорость?
Я пытался сделать это с помощью пайпов, но ничего не получилось.
Он работает на виртуальной машине Vmware под управлением Windows 2009 R2 SP1 с 4 ГБ памяти. Когда я запускаю его, он использует около 60% процессора.
Вот код, который я написал. Я новичок в Powershell, но у меня большой опыт работы с Perl. Мои коллеги сказали написать bat-файл.
<#
.SYNOPSIS
C:\ams\psscripts\list-files.ps1
.DESCRIPTION
List all the files that a given user owns
.PARAMETER none
username: user
logfile: path to log file. This is optional. If omitted the the log file is created "u:\scratch\<$username>-files.txt
.EXAMPLE
C:\ams\psscripts\list-files.ps1 plo
Example: C:\ams\psscripts\list-files.ps1 plo u:\scratch\log.txt
#>
param (
[string]$username,
[string]$logfile
)
# Load modules
Set-ExecutionPolicy Unrestricted
Import-Module ActiveDirectory
Add-PSSnapin Quest.ActiveRoles.ADManagement
function printHelp {
Write-Host "This script will find all the files owned by a user. It scans \\dfs\groups"
Write-Host "C:\ams\psscripts\list-files.ps1 user logfile (optional)"
Write-Host "Example: C:\ams\psscripts\list-files.ps1 plo"
Write-Host "Example: C:\ams\psscripts\list-files.ps1 plo u:\scratch\log.txt"
}
if ($logfile -eq "") {
$logfile = "u:\scratch\" + $username + "-files.txt"
Write-Host "Setting log file to $logfile"
}
# you must use a UNC path
[String]$path = "\\dfs\u$\groups"
[String]$AD_username = "AMS\" + $username
# check that we have a valid AD user
if (!(Get-QADUser $AD_username)){
Write-Host "ERROR: Not a valid AD User: $AD_username"
Exit 0
}
Write-Output "Listing all files owned by $username from $path" | Out-File -FilePath $logfile
Write-Host "Listing all files owned by $username from $path"
$d = Get-Date
Write-Output $d | Out-File -FilePath $logfile -Append
$files = Get-ChildItem $path -Recurse
Foreach ($file in $files)
{
$f = Get-Acl $file.FullName
$d = [string]::Compare($file.FullName, $username, $True)
if (($f.Owner -eq $username) -or ($f.Owner -eq $AD_username))
{
Write-Host "$file.FullName"
Write-Output $file.FullName | Out-File -FilePath $logfile -Append
}
}
Write-Host "Completed"
exit 0
Следующим шагом, который я должен сделать, является изменение сценария выше, чтобы найти файлы, принадлежащие данному пользователю, и изменить их на их менеджера.
Это скрипт, который я нашел для смены владельца. Это будет цикл, который проходит по файловой системе. Это хороший способ сделать это.
$username=”dnp”
$domain=”ams”
$ID = new-object System.Security.Principal.NTAccount($domain, $username)
# file to change owner. must be UNC path
$path = "\\dfs\c$\ams\psscripts\test.txt"
write-host $path
$acl = get-acl $path
$acl.SetOwner($ID)
set-acl -path $path -aclObject $acl
Спасибо, Дэн