Best way that i found:
On all computers in the domain using GPP create a task for the regular run powershell script with local system account:
$Account = "DOMAIN\Group_deny_print"
Get-Printer -full | Where-Object Type -eq "Local" | foreach {
try
{
$acl = New-Object -TypeName Security.AccessControl.CommonSecurityDescriptor $false, $false, ($_ | Select-Object PermissionSDDL -ExpandProperty PermissionSDDL);
Write-Host "Deny $Account print to printer ($_.Name)";
$NTAccountSid = (New-Object Security.Principal.NTAccount $Account).Translate([Security.Principal.SecurityIdentifier]).Value;
$acl.DiscretionaryAcl.AddAccess(
[System.Security.AccessControl.AccessControlType]::Deny,
$NTAccountSid,
131080, #Print = (ACCESS_MASK.PRINTER_ACCESS_USE | BASE_RIGHTS.READ_CONTROL),
[System.Security.AccessControl.InheritanceFlags]::None,
[System.Security.AccessControl.PropagationFlags]::None);
$newacl = $acl.GetSddlForm("All");
}
catch [Exception]
{
Write-Error -Message "Failed:`n $_.Message" -Exception $_.Exception
}
$_ | Set-Printer -PermissionSDDL $newacl -verbose;
}
But int's work only in Windows Server 2012 / Windows 8
or later.