目次
バッチの内容
バッチの基本的な内容は以下の通りです。
設定する場所は、以下の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/フルコントロール」権限を付与するコマンド終了
# ============================================================