SQL Server 向けのローカルセキュリティポリシーで割り当てるユーザー権限として、
- ボリュームの保守タスクを実行 (瞬時初期化の利用)
- メモリ内のページのロック (LPM を使用したバッファキャッシュの割り当て)
があります。
これをコマンド実行する際の方法を少しまとめてみたいと思います。
コマンドといってもそのものずばりなものが見つかりませんでした…。
ということで secedit を使ってごにょごにょしてみました。
管理者として実行した PowerShell で以下を実行します。
try{
$ErrorActionPreference = "Stop"
$MSSQLSERVERSID = "S-1-5-80-3880718306-3832830129-1677859214-2598158968-1052248003"
$LOCALSYSSID = "S-1-5-18"
$NewPolicy = "new_policy.inf"
$CurrentPolicy = "current_secedit.inf"
$SQLSVCAC = (Get-WmiObject win32_service -Filter "Name='MSSQLSERVER'")
if($SQLSVCAC.StartName -eq "NT ServiceMSSQLSERVER")
{
$SQLSVCSID = $MSSQLSERVERSID
}elseif($SQLSVCAC.StartName -eq "LocalSystem"){
$SQLSVCSID = $LOCALSYSSID
}else{
$SQLSVCSID = (Get-WmiObject win32_useraccount -Filter "Name='$(($SQLSVCAC.StartName).Split("")[1])'").SID
}
secedit /export /areas user_rights /cfg $CurrentPolicy
$SeLMP = (Get-Content $CurrentPolicy | Select-String "SeLockMemoryPrivilege")
if ($SeLMP -ne $null){
$SeLMP = $SeLMP.ToString() + ",*" + $SQLSVCSID
}else{
$SeLMP = "SeLockMemoryPrivilege = *" + $SQLSVCSID
}
$SeMVP = (Get-Content $CurrentPolicy | Select-String "SeManageVolumePrivilege")
if ($SeMVP -ne $null){
$SeMVP = $SeMVP.ToString() + ",*" + $SQLSVCSID
}else{
$SeMVP = "SeManageVolumePrivilege = *" + $SQLSVCSID
}
@"
[Unicode]
Unicode=yes
[Version]
signature="`$CHICAGO`$"
Revision=1
[Privilege Rights]
"@ | Out-File -FilePath $NewPolicy -Append
$SeLMP | Out-File -FilePath $NewPolicy -Append
$SeMVP | Out-File -FilePath $NewPolicy -Append
secedit /configure /db hisecws.sdb /cfg $NewPolicy
Write-Host "completed!!"
}catch [Exception]{
Write-Host "failed!!"
Write-Host $Error[0]
}
secedit には、ユーザー ログオンの権利と特権の付与 をエクスポートするための機能があります。
これで、現状の設定をエクスポートして、最後に SQL Server のサービスアカウントを追加して、インポートをしています。
ユーザーアカウントの SID であれば、WMI 経由で取得 できるようなのですが、サービスアカウントの SID の取得方法がわからなかったので固定で記述してしまっています。
# いくつかの環境で確認したところ、SQL Server の既定のインスタンスのサービス SID は同一のようだったので。
SID については Windows オペレーティング システムの既知のセキュリティ識別子 に一部記載されています。
なお、サービスアカウントの SID については SC コマンドで確認をしています。
![]()
SQL Server をローカルシステムアカウントで実行している場合の対応はしているのですが、そのほか (Local Service / Network Service) については対応をしていないので、この辺も改善の余地はあるかと。