SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server 向けのローカルセキュリティポリシーをコマンドで設定

leave a comment

SQL Server 向けのローカルセキュリティポリシーで割り当てるユーザー権限として、

  • ボリュームの保守タスクを実行 (瞬時初期化の利用)
  • メモリ内のページのロック (LPM を使用したバッファキャッシュの割り当て)

image

があります。

これをコマンド実行する際の方法を少しまとめてみたいと思います。

コマンドといってもそのものずばりなものが見つかりませんでした…。

ということで 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 コマンドで確認をしています。

image

SQL Server をローカルシステムアカウントで実行している場合の対応はしているのですが、そのほか (Local Service / Network Service) については対応をしていないので、この辺も改善の余地はあるかと。

Written by masayuki.ozawa

10月 13th, 2013 at 11:04 pm

Posted in SQL Server

Tagged with

Leave a Reply

*