Update NTFS ACL eines Verzeichnisses
Hi zusammen,
ich hatte ja im vorherigen Post ein Skript gefunden und ich spiele damit gerade herum
Momentan habe ich ein Problem, aber aktuell seh ich den Wald vor lauter Bäumen nicht.
Es sollen die Berechtigungen auf der Ebene
\\File\TestOrdner aktualisiert werden ( also bei einem Match den neuen Account nehmen und z.B. Domänen-Benutzer ersetzen, bei einem neuen eintrag ohne Match den Benutzer entsprechend Berechtigungen mit Angabe z.B. FULLControl oder ohne Angabe - Modify ).
Der Inhalt vom TestOrdner hat die Berechtigungen so wie in der Tabelle aber nicht der Ordner selbst.
Hilfe, Freitag. Irgendwie ist da total der Wurm drin. Findet das jemand?
Matching Tabelle
ich hatte ja im vorherigen Post ein Skript gefunden und ich spiele damit gerade herum
Momentan habe ich ein Problem, aber aktuell seh ich den Wald vor lauter Bäumen nicht.
Es sollen die Berechtigungen auf der Ebene
\\File\TestOrdner aktualisiert werden ( also bei einem Match den neuen Account nehmen und z.B. Domänen-Benutzer ersetzen, bei einem neuen eintrag ohne Match den Benutzer entsprechend Berechtigungen mit Angabe z.B. FULLControl oder ohne Angabe - Modify ).
Der Inhalt vom TestOrdner hat die Berechtigungen so wie in der Tabelle aber nicht der Ordner selbst.
Hilfe, Freitag. Irgendwie ist da total der Wurm drin. Findet das jemand?
Matching Tabelle
OldAccount,NewAccount,AccessRights
TEST\Domänen-Benutzer,TEST1\123456
,TEST1\1234t,FullControl
,TEST1\Admins,
Param(
# Parameter for the Search Base. This is the root folder path.
[Parameter(Mandatory=$true)]
[string]$SearchBase,
# Parameter for the path to the mapping CSV file.
[Parameter(Mandatory=$true)]
[string]$MappingCsvPath,
# Parameter for the log file path.
[Parameter(Mandatory=$true)]
[string]$LogFilePath,
# Optional parameter to keep old permissions.
[Parameter(Mandatory=$false)]
[switch]$KeepOldPermissions
)
# Function to log messages to the log file.
function Write-Log {
param (
[string]$Message,
[string]$LogType = "INFO"
)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$logMessage = "[$timestamp][$LogType] $Message"
Add-Content -Path $LogFilePath -Value $logMessage
}
# Import the NTFS Security PowerShell Module
Try {
Import-Module NTFSSecurity
Write-Log "NTFS Security PowerShell Module imported successfully."
} Catch {
Write-Log "The NTFS Security PowerShell Module could not be imported. Please check that it is installed." -LogType "ERROR"
Exit
}
# Load the mapping CSV into a hashtable for quick lookup.
$mappingTable = @{}
Try {
Import-Csv -Path $MappingCsvPath -Encoding Unicode | ForEach-Object {
$oldAccount = $_.OldAccount
$newAccount = $_.NewAccount
$accessRights = if ($_.AccessRights) { $_.AccessRights } else { "Modify" }
# Store in the mapping table
$mappingTable[$newAccount] = @{
OldAccount = $oldAccount
AccessRights = $accessRights
}
}
Write-Log "Mapping CSV loaded successfully."
} Catch {
Write-Log "Failed to load the mapping CSV from $MappingCsvPath." -LogType "ERROR"
Exit
}
function Update-ACL {
param (
[string]$Path
)
# Get current ACLs
$acl = Get-NTFSAccess -Path $Path -ExcludeInherited
# Track existing accounts to check if new permissions need to be added
$existingAccounts = @($acl | ForEach-Object { $_.Account.AccountName })
ForEach ($newAccount in $mappingTable.Keys) {
$oldAccount = $mappingTable[$newAccount].OldAccount
$accessRights = $mappingTable[$newAccount].AccessRights
if ($oldAccount -and $existingAccounts -contains $oldAccount) {
# Update existing permissions if there's a matching old account
Write-Log "Updating $oldAccount to $newAccount on $Path with $accessRights rights."
Try {
# Optionally remove the old ACE
If (-not $KeepOldPermissions.IsPresent) {
Remove-NTFSAccess -Path $Path -Account $oldAccount -AccessRights $accessRights
Write-Log "Removed old ACE for $oldAccount on $Path"
}
# Add new ACE
Add-NTFSAccess -Path $Path -Account $newAccount -AccessRights $accessRights
Write-Log "Added new ACE for $newAccount on $Path"
} Catch {
Write-Log "Failed to update ACL for $Path" -LogType "ERROR"
}
} elseif (-not $existingAccounts -contains $newAccount) {
# Add new permissions if the account does not exist in current ACLs
Write-Log "Adding new ACE for $newAccount on $Path with $accessRights rights."
Try {
Add-NTFSAccess -Path $Path -Account $newAccount -AccessRights $accessRights
Write-Log "Added new ACE for $newAccount on $Path"
} Catch {
Write-Log "Failed to add new ACL for $Path" -LogType "ERROR"
}
} else {
Write-Log "No action needed for $newAccount on $Path"
}
}
}
#region Top-Level Folder
# Update ACLs for the top-level folder
$topFolder = Get-Item -Path $SearchBase
Update-ACL -Path $topFolder.FullName
#endregion
#region Child Folders and Files
# Get all the child folders and files.
$children = Get-ChildItem -Path $SearchBase -Recurse
ForEach ($child in $children) {
Update-ACL -Path $child.FullName
}
#endregion
# Log completion of the script.
Write-Log "NTFS permissions update completed for $SearchBase."
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 667772
Url: https://administrator.de/contentid/667772
Ausgedruckt am: 21.11.2024 um 12:11 Uhr
1 Kommentar