Я работаю над проектом, в котором мне нужно иметь возможность проверять права различных пользователей и групп пользователей на файловом сервере Windows в формате NTFS. Я хотел бы использовать PowerShell и сделать так, чтобы он рекурсивно выполнял поиск в удаленном файловом ресурсе, или он мог бы запускаться на самом сервере и выводить все разрешения, которые он находит, либо для всего, либо для указанного пользователя или группы пользователей. Цель состоит в том, чтобы иметь возможность использовать это для периодического аудита пользователей и групп пользователей, чтобы гарантировать, что не происходит сползания разрешений и что все разрешения устанавливаются одинаково разными системными администраторами. Наконец, он будет использоваться для определения того, где нам нужно внести изменения, когда мы меняем группы пользователей в групповой политике. Есть ли какие-нибудь общие способы подойти к этому? Справится ли PowerShell с этой задачей? Возможно ли, чтобы PowerShell выводил результаты в читаемый формат?
Несколько месяцев назад я прочитал блестящий пост, посвященный аналогичной ситуации, по сути, удаленно запустив скрипт, который использует командлет Get-ACL для рекурсивного перечисления списков списков управления доступом для пути и передает вывод через командлет Export-CSV для хорошего обзора. :
http://jfrmilner.wordpress.com/2011/05/01/audit-ntfs-permissions-powershell-script/
Похоже на ссылку Иудаскариот 1651 при условии. Я больше пошел к тому, чтобы сделать снимок того, что я знаю, хорошо, а затем сравнивать его всякий раз, когда мне было нужно, запустив сценарий. Я сравнил права доступа к файлам, выведя в XML то, что он нашел в настоящее время разрешения, а затем сравнил это с моим базовым XML-файлом, используя Compare-Object
. Может быть, неточно, но как я это делал ...
Примечание: в то время эта работа была незавершенной и ориентирована на конкретные пути, которые мне нужно было отслеживать, которые я извлек из чтения значений ключей реестра. Основная суть того, что вам, вероятно, нужно, начинается рядом с «Сбор информации о ...». Я просто хотел предоставить весь код, чтобы показать, как / что я делал.
#Get date/time for file name
$d = Get-Date -format "yyyyMMdd"
# Pull instance names found on server
$inst = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server').InstalledInstances
$warningpreference = "Continue"
foreach($i in $inst)
{ $p = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$i
$bin = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\Setup").SQLBinRoot
$ver = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\MSSQLServer\CurrentVersion").CurrentVersion
switch -wildcard ($ver)
{
"9*" {$client = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\90').VerSpecificRootDir; break }
"10*" {$client = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\100').VerSpecificRootDir; break }
}
$currentFile = $i + "_" + $d + ".xml"
"Collecting information on $bin and $client for $i"
$bin,$client | foreach { Get-ChildItem $_ -Recurse } |
Select FullName, CreationTimeUTC, LastWriteTimeUtc, PSIsContainer, Length,
@{Name='Owner';Expression={ (Get-Acl $_.PSPath).Owner }},
@{Name='ACLRights';Expression={ (Get-Acl $_.PSPath).Access | Select FileSystemRights }},
@{Name='ACLUser';Expression={ (Get-Acl $_.PSPath).Access | Select IdentityReference }},
@{Name='ACLAccessType';Expression={ (Get-Acl $_.PSPath).Access | Select AccessControlType}} |
Export-Clixml $currentFile
"Current file is: $currentFile"
$basefile = "baseline_$i.xml"
if (Test-Path $basefile)
{
$base = Import-Clixml $basefile
$current = Import-Clixml $currentFile
#now compare
$results = "Results_" + $i + "_" + $d + ".txt"
Compare-Object $base $current -Property CreationTimeUTC, LastWriteTimeUtc, Length, FullName, Owner, AclRights, AclUser, AclAccessType |
Out-File $results
#determine if the results file shows any changes, if so wave a flag
if ((Get-Content $results).Length -eq $null)
{
"ZERO Changes found"
}
else
{
"changes found"
}
}
else
{
Write-Warning -Message "WARNING: No base file found to compare."
}
}
В этом случае я думаю, что инструменты Sysinternals AccessChk и AccessEnum могут лучше подойти для того, что вы ищете. Их можно найти в разделе "Файловые и дисковые утилиты". Вот.