【Windows】「プリンターのプロパティ」のセキュリティアクセスをすべて許可する一括変更バッチを作成してみた!

目次

バッチの内容

バッチの基本的な内容は以下の通りです。
設定する場所は、以下の2箇所です。

「$user = “everyone” 」
「$printerName = “対象プリンタの表示名” 」

「$printerName」は、デバイスとプリンターの画面に表示されているプリンタ名を入力します。
例えば、「Microsoft Print to PDF」であれば、この名前を「$printerName」として設定します。

REM ============================================================
REM 対象プリンタに対して「Everyone/フルコントロール」権限を付与するコマンド
REM ============================================================
@(echo '> NUL
echo off)

REM 管理者権限か確認
NET SESSION > NUL 2>&1

REM 管理者でなければ -ExecutionPolicy してから再起実行(RESTART)
IF %ERRORLEVEL% neq 0 goto RESTART

REM 管理者権限なら PS を呼んで★を実行する
setlocal enableextensions
set "THIS_PATH=%~f0"
set "PARAM_1=%~1"
PowerShell.exe -Command "iex -Command ((gc \"%THIS_PATH:`=``%\") -join \"`n\")"

exit /b %errorlevel%

:RESTART
powershell -NoProfile -ExecutionPolicy unrestricted -Command "Start-Process %~f0 -Verb runas"
exit
') | sv -Name TempVar


# ============================================================
# ここから先に PowerShellスクリプトを記述する(コメントもREMでなく「#」になるので注意)
# PowerShellスクリプトを記述(ここからは1台のプリンタにつき、1セットずつ繰り返しコマンドが必要です。)
# 設定する際には、「$user」に対象ユーザー名と「$printerName」に対象のプリンタ名を指定してください。
# ============================================================

$user = "everyone" # 対象ユーザ名
$printerName = "対象プリンタの表示名" # 対象プリンタ名

$printer = Get-WmiObject -Class win32_printer |
    Where-Object {$_.Name -eq $printerName}

# プリンタのSecurity Descriptorを取得する
$sd = $printer.GetSecurityDescriptor().Descriptor

# DACLから$user以外のACEを取得する
$aces = @($sd.DACL | 
    Where-Object {$_.Trustee.Name -ne $user}) 

# ACEオブジェクトを生成する関数
# see: https://docs.microsoft.com/ja-jp/windows/desktop/CIMWin32Prov/setsecuritydescriptor-method-in-class-win32-printer
function createAce
{
    param([string]$user, [int]$accessMask, [int]$type, [int]$flags)

    $ace = ([WMIClass] "Win32_Ace").CreateInstance()
    $Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
    $SID = (new-object security.principal.ntaccount $user).translate([security.principal.securityidentifier])
    [byte[]] $SIDArray = ,0 * $SID.BinaryLength
    $SID.GetBinaryForm($SIDArray,0)
    $Trustee.Name = $user
    $Trustee.SID = $SIDArray
    $ace.AccessMask = $accessMask
    $ace.AceType = $type
    $ace.AceFlags = $flags 
    $ace.Trustee = $Trustee
    return $ace
}

# $user以外のACEと新しく作った$userのACEを結合
$aces += 
    @(createAce -user $user -accessMask 983052 -type 0 -flags 0) +  # ManagePrinters 
    @(createAce -user $user -accessMask 983088 -type 0 -flags 9)    # ManageDocuments 

$sd.DACL = [System.Management.ManagementBaseObject[]]$aces # DACLを更新
$printer.psbase.Scope.Options.EnablePrivileges = $true # 上書き許可
$ret = $printer.SetSecurityDescriptor($sd).ReturnValue # Security Descriptorを更新

if($ret -eq 0)
{
    Write-Host "${user}の${printerName}に対するアクセス権を更新しました。"
}
else
{
    Write-Host "アクセス権更新に失敗しました。"
}

# ============================================================
# 対象プリンタに対して「Everyone/フルコントロール」権限を付与するコマンド終了
# ============================================================
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次