Grants the SQL Server service accounts (Engine and Agent) the required NTFS permissions on the instance's data, log, TempDB and backup directories. Auto-discovers accounts via Get-DbaService and directories via Get-DbaDefaultPath + sys.master_files. Saves an ACL backup (SDDL JSON) before making any changes. Supports FullControl or Modify with full -WhatIf/-Confirm support.
Execution Flow
Synopsis
When -Account and -Directory are both omitted, the function auto-discovers both from the target SQL instance. Service accounts are resolved via Get-DbaService -Type Engine,Agent filtered by the instance name; if no instance-specific match is found, all SQL service accounts on the server are used. Directories come from Get-DbaDefaultPath (Data, Log, Backup) and from sys.master_files (which includes TempDB). Only directories that actually exist (Test-Path -PathType Container) are processed. The ACL backup file is a JSON array of {Path, Sddl} objects that can be used for manual rollback via Set-Acl.
Requires dbatools. Intended to run on the SQL Server host itself. Permissions are applied locally via Set-Acl — no remoting needed.
Syntax
Invoke-sqmNtfsSetup
[-SqlInstance <String>] # default: $env:COMPUTERNAME
[-SqlCredential <PSCredential>]
[-Account <String[]>] # override: specific accounts to grant
[-Directory <String[]>] # override: specific directories to set
[-Permission <FullControl|Modify>] # default: FullControl
[-BackupPath <String>] # default: Get-sqmConfig OutputPath
[-SkipBackup] # skip ACL backup (not recommended)
[-EnableException]
[-WhatIf] [-Confirm]
Parameters
Parameter
Type
Default
Description
-SqlInstance
String
$env:COMPUTERNAME
Target SQL Server instance.
-SqlCredential
PSCredential
—
SQL auth credentials for the dbatools connection.
-Account
String[]
Auto-discovered
Explicit account(s) to grant. Overrides auto-discovery.
-Directory
String[]
Auto-discovered
Explicit directory path(s). Overrides auto-discovery from SQL.
-Permission
String
FullControl
FullControl or Modify.
-BackupPath
String
Get-sqmConfig OutputPath
Directory for the ACL backup JSON file.
-SkipBackup
Switch
$false
Skip the ACL backup. Not recommended — backup failure aborts by default.
Return Value
Property
Description
SqlInstance
Target instance name.
Accounts
Accounts that were granted permissions.
Directories
Directories that were processed.
Permission
Permission level applied (FullControl or Modify).
BackupFile
Path to the ACL backup JSON file ($null if skipped).
Granted
Array of strings: "account → directory" for each successful assignment.
Status
Granted — all succeeded; PartialFailure — some failed; Failed — all failed; BackupFailed — aborted before granting; NoAccounts/NoDirectories — nothing to process; WhatIfSkipped — dry run.
Message
Human-readable summary including failure details.
Examples
# Auto-discover everything and grant FullControlInvoke-sqmNtfsSetup-SqlInstance"SQL01"# Dry run: shows accounts and directories without changing ACLsInvoke-sqmNtfsSetup-SqlInstance"SQL01\INST01"-Permission Modify -WhatIf# Override directories and account explicitlyInvoke-sqmNtfsSetup `
-Directory'E:\MSSQL\DATA', 'F:\MSSQL\LOG' `
-Account'NT SERVICE\MSSQLSERVER'# Check result$r = Invoke-sqmNtfsSetup-SqlInstance"SQL01"Write-Host"$($r.Status): $($r.Granted.Count) ACL(s) set | Backup: $($r.BackupFile)"