Jump to content

FrettchenSkript

Members
  • Gesamte Inhalte

    5
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von FrettchenSkript

  1. Ich hab die DCOM berechtigungen gesetzt jetzt Funktioniert auch alles.

    Danke für den Link. Nun bekomme ich aber leider sobald ein Zweiter Benutzer das Skript ausgeführt hat folgende Fehlermeldung

    Get-WmiObject : Fehler beim Anbieter
    In Zeile:127 Zeichen:13
    + $printers = Get-WmiObject -Class Win32_Printer -ComputerName $printSe ...
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], ManagementException
        + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

     

    Nach ca. 1 Stunden tritt der Fehler erst wieder auf wenn ein Zweiter Benutzer auch das Skript ausführt.
    Benutzer 1 konnte das Skript davor 20 mal ohne Problem ausführen.

     

    Jemand einen idee?

    MFG
    Luca

  2. 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

     



     

×
×
  • Neu erstellen...