Hi, da das hier mein erster Beitrag ist sorry sollte hier etwas Falsch machen.
Ich hab folgendes Skript geschrieben um Drucker anhand des PC name im Standortfeld auf dem Printserver auf den Druckern zuweisen zukönnen.
Das Skript funktioniert wunderbar wenn man es mit einem Domain Admin ausführt.
# Setze den Print Server und den aktuellen PC-Namen
$printServer = "VM-PRINTSERVER"
$currentPCName = $env:COMPUTERNAME
$printerToSetAsDefault = "*$currentPCName"+"_d*" # Setzen Sie den Standarddrucker für PCName_D
# Pfad für den Ordner
$scriptFolder = "$env:USERPROFILE\Documents\Drucker_Skript"
# Prüfe, ob der Ordner vorhanden ist, und erstelle ihn gegebenenfalls
if (-not (Test-Path -Path $scriptFolder -PathType Container)) {
New-Item -Path $scriptFolder -ItemType Directory | Out-Null
}
# Lösche Logdateien, die älter als 31 Tage sind
$oldLogs = Get-ChildItem -Path $scriptFolder -Filter "Drucker_Skript_Log_*.txt" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-31) }
$oldLogs | ForEach-Object {
Remove-Item $_.FullName -Force
}
# Öffne die Drucker Übersicht im Windows Explorer
Start-Process "C:\Windows\explorer.exe" -ArgumentList "shell:::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\::{2227A280-3AEA-1069-A2DE-08002B30309D}"
# Warte 3 Sekunden
Start-Sleep -Seconds 3
# Pfad für die LOG-Datei
$errorLogPath = Join-Path $scriptFolder "Drucker_Skript_Log_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt"
# Überprüfe die Erreichbarkeit des Printservers
$printServerReachable = Test-Connection -ComputerName $printServer -Count 1 -Quiet
# Funktion zum Hinzufügen eines Druckers mithilfe von rundll32.exe
function Add-PrinterUsingRundll32 {
param (
[string]$printerName
)
try {
# Verwende rundll32.exe, um den Drucker hinzuzufügen
Write-Host "Füge Drucker $printerName zu $currentPCName hinzu..."
$command = "rundll32.exe printui.dll,PrintUIEntry /y /n `"\\$printServer\$printerName`""
Invoke-Expression -Command $command
# Schreibe Erfolgsmeldung in die Protokolldatei
"Drucker $printerName wurde zu $currentPCName hinzugefügt." | Out-File -FilePath $errorLogPath -Append
} catch {
# Bei einem Fehler, erstelle eine LOG-Datei im Skriptordner
$errorMessage = "Fehler beim Hinzufügen des Druckers: $($error[0].Exception.Message)"
$errorMessage | Out-File -FilePath $errorLogPath -Append
}
}
# Funktion zum Entfernen eines Druckers vom PC
function Remove-PrinterFromPC {
param (
[string]$printerName
)
try {
# Drucker vom PC entfernen
Write-Host "Entferne Drucker $printerName von $currentPCName..."
Remove-Printer -Name $printerName -ErrorAction Stop
# Schreibe Erfolgsmeldung in die Protokolldatei
"Drucker $printerName wurde von $currentPCName entfernt." | Out-File -FilePath $errorLogPath -Append
} catch {
# Bei einem Fehler, erstelle eine LOG-Datei im Skriptordner
$errorMessage = "Fehler beim Entfernen des Druckers: $($error[0].Exception.Message)"
$errorMessage | Out-File -FilePath $errorLogPath -Append
}
}
# Funktion zum Hinzufügen eines Druckers zum PC basierend auf dem Standortfeld
function Add-PrinterToPCBasedOnLocation {
param (
[string]$printerName,
[string]$location
)
try {
# Überprüfe, ob der PC-Name im Standortfeld vorhanden ist
if ($location -like "*$currentPCName*" -or $location -like "*$currentPCName"+"_d*" -or $location -like "*$currentPCName"+"_D*") {
Write-Host "Füge Drucker $printerName zu $currentPCName hinzu..."
# Hier verwenden wir das .NET-Objekt für das Hinzufügen des Druckers
$printer = (New-Object -ComObject WScript.Network).AddWindowsPrinterConnection("\\$printServer\$printerName")
# Setze den Drucker als Standard, wenn er den Kriterien entspricht
if ($printerName -eq $printerToSetAsDefault) {
Add-PrinterUsingRundll32 -printerName $printerName
Write-Host "Standarddrucker wurde auf $printerName festgelegt."
}
# Schreibe Erfolgsmeldung in die Protokolldatei
"Drucker $printerName wurde zu $currentPCName hinzugefügt." | Out-File -FilePath $errorLogPath -Append
}
} catch {
# Bei einem Fehler, erstelle eine LOG-Datei im Skriptordner
$errorMessage = "Fehler beim Hinzufügen des Druckers: $($error[0].Exception.Message)"
$errorMessage | Out-File -FilePath $errorLogPath -Append
}
}
# Drucker vom PC entfernen (vor dem Hinzufügen neuer Drucker)
$existingPrinters = Get-WmiObject -Class Win32_Printer
if ($printServerReachable) {
foreach ($existingPrinter in $existingPrinters) {
# Gib den Namen des Druckers an, den du nicht entfernen möchtest
$printersToExclude = @("STARFACE Fax", "Fax", "Microsoft Print to PDF", "Microsoft XPS Document Writer")
# Überprüfe, ob der aktuelle Drucker der auszuschließende Drucker ist
# Überprüfe, ob der aktuelle Drucker in der Liste der auszuschließenden Drucker ist
if ($printersToExclude -notcontains $existingPrinter.Name) {
Remove-PrinterFromPC -printerName $existingPrinter.Name
}
}
} else {
$errorServerUnreachable = "Printserver $printServer ist nicht erreichbar."
$errorServerUnreachable | Out-File -FilePath $errorLogPath -Append
Write-Host "FEHLER: $errorServerUnreachable Drucker werden nicht entfernt."
Write-Host "Skript wird beendet."
exit 1
}
# Hole die Liste der Drucker vom Print Server
$printers = Get-WmiObject -Class Win32_Printer -ComputerName $printServer
foreach ($printer in $printers) {
$location = $printer.Location
$assignedPCs = $location -split ';'
foreach ($assignedPC in $assignedPCs) {
# Füge Drucker zum PC basierend auf dem Standortfeld hinzu
Add-PrinterToPCBasedOnLocation -printerName $printer.Name -location $assignedPC.Trim()
}
}
# Warte 2 Sekunden
Start-Sleep -Seconds 2
# Funktion zum Durchsuchen der Drucker und zum Schreiben ins Log
function SearchAndLogPrinters {
param (
[string]$searchTerm,
[string]$logFilePath
)
$printers = Get-WmiObject -Query "SELECT * FROM Win32_Printer"
foreach ($printer in $printers) {
$location = $printer.Location
if ($location -like "*$searchTerm*") {
$logMessage = "PC-Name: $searchTerm, Drucker: $($printer.Name), Standort: $location"
Add-Content -Path $logFilePath -Value $logMessage
# Druckernamen vor dem Festlegen des Standarddruckers ins Log schreiben
$logMessage = "Ausgewählter Drucker: $($printer.Name)"
Add-Content -Path $logFilePath -Value $logMessage
# Aufrufen der Funktion zum Festlegen des Standarddruckers
SetDefaultPrinter -printerName $printer.Name
}
}
}
# Funktion zum Festlegen des Standarddruckers
function SetDefaultPrinter {
param (
[string]$printerName
)
rundll32.exe printui.dll,PrintUIEntry /y /n "$printerName"
}
# Aufrufen der Funktion und Suche nach dem PC-Namen
SearchAndLogPrinters -searchTerm $currentPCName -logFilePath $errorLogPath
Write-Host "Vorgang abgeschlossen."
Jetzt scheiter ich leider daran das Skript mit normalen Rechten auszuführen als Fehlermeldung bekomme ich diese:
Get-WmiObject : Zugriff verweigert
In C:\Users\Max.Mustermann\Desktop\Drucker Skript Test 19.ps1:127 Zeichen:13
+ $printers = Get-WmiObject -Class Win32_Printer -ComputerName $printSe ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-WmiObject], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
Wie kann ich am Sichersten den Zugriff auf den Printserver gewährleisten?
Gibt es hier evtl einen möglichkeit mit einer AD Sicherheisgruppe zuarbeiten?
Oder kann man das Skript evtl mit einem Zertifikart so ausstatten das er Printserver nur diese Skript Aktzeptiert?
bin für jede idee Dankbar