Universelles Drucken PowerShell-Anwendungsbeispiele

Das PowerShell-Modul UniversalPrintManagement unterstützt die etablierten PowerShell-Skriptmuster. In diesem Artikel werden einige Muster als Ausgangspunkt gezeigt, wie die Cmdlets kombiniert werden können, um ausgewählte Anwendungsfälle anzugehen.

Nicht interaktive Universelles Drucken Verbindung

Einer der Hauptwerte der Verwendung von PowerShell besteht darin, nicht interaktive Skripts zu erstellen, die immer wieder ausgeführt werden können. Die Notwendigkeit, die Benutzeranmeldeinformationen einzugeben, um die Verbindung mit Universelles Drucken herzustellen, geht gegen diese Idee. Eine Möglichkeit, dieses Problem zu lösen, besteht darin, das Passwort des Benutzers sicher zu speichern und bei Bedarf abzurufen.

  1. Sicheres Speichern des Kennwortschlüssels in einer Datei
  2. Kennwort direkt vor dem Aufruf von Connect-UPService abrufen
$Secure = Read-Host -AsSecureString
$Encrypted = ConvertFrom-SecureString -SecureString $Secure -Key (1..16)
$Encrypted | Set-Content Encrypted.txt
...
$Secure2 = Get-Content Encrypted.txt | ConvertTo-SecureString -Key (1..16)
Connect-UPService -UserPrincipalName username@tenantname.com -Password $Secure2

Hinweis

Weitere Informationen zu ConvertFrom-SecureString und ConvertTo-SecureString sind hier verfügbar.

Mehrere Drucker eines Connectors deregistrieren

Vorausgesetzt, Sie kennen bereits den Namen des registrierten Connectors, der zum Registrieren der Drucker verwendet wurde. Informationen zum Abrufen einer Liste der registrierten Konnektoren finden Sie im Cmdlet Get-UPConnector.

  1. Herstellen einer Verbindung mit Universelles Drucken
  2. Abrufen der Liste der über den jeweiligen Connector registrierten Drucker
  3. Entfernen des registrierten Druckers
Connect-UPService
$ConnectorPrinters = Get-UPPrinter -IncludeConnectorDetails
$ConnectorPrinters.Results | Where-Object {$_.Connectors.DisplayName -Contains "<Connector Name>"} | Remove-UPPrinter

Identifizieren des registrierten Druckers hinter einem freigegebenen Druckernamen

  1. Herstellen einer Verbindung mit Universelles Drucken
  2. Abrufen der Liste der Drucker und Verwenden des lokalen Computers zum Filtern der Ergebnisse
Connect-UPService
$Printers = Get-UPPrinter
$Printer = $Printers.Results | Where-Object {$_.Shares.DisplayName -eq "<Share Name>"}

Freigabe von Druckern stapelweise aufheben

  1. Herstellen einer Verbindung mit Universelles Drucken
  2. Abrufen der Liste der drucker von Interesse
  3. Freigabe der Druckersammlung aufheben

Hinweis

Dieses Beispiel zeigt das Aufheben der Freigabe aller freigegebenen Drucker. Um die Freigabe nur für ausgewählte Drucker aufzuheben, können beim Abrufen der Drucker zusätzliche Filter hinzugefügt werden.

Connect-UPService
$Printers = Get-UPPrinter
$Printers.Results.Shares | Remove-UPPrinterShare

Stapelweise allen Benutzern Zugriff auf freigegebene Drucker gewähren

  1. Herstellen einer Verbindung mit Universelles Drucken
  2. Liste der relevanten Druckerfreigaben abrufen
  3. Gewähren des Benutzerzugriffs auf die Sammlung von Druckern
Connect-UPService
$PrinterShares = Get-UPPrinterShare
$PrinterShares.Results | Grant-UPAccess -AllUsersAccess

Benutzern oder Benutzergruppen stapelweise Zugriff auf freigegebene Drucker gewähren

  1. Voraussetzung: Benutzer-IDs und IDs von Benutzergruppen abrufen
  2. Herstellen einer Verbindung mit Universelles Drucken
  3. Liste der relevanten Druckerfreigaben abrufen
  4. Gewähren bestimmter Benutzer oder Gruppen Zugriff auf die Sammlung von Druckern
Connect-AzAccount
$Users = Get-AzADUser -First 10
$UserGroups = Get-AzADGroup -SearchString Contoso

Connect-UPService
$PrinterShares = Get-UPPrinterShare
$Users | ForEach-Object {$PrinterShares.Results | Grant-UPAccess -UserID $_.Id}
$UserGroups | ForEach-Object {$PrinterShares.Results | Grant-UPAccess -GroupID $_.Id}

Standorteigenschaften des Druckers stapelweise festlegen

  1. Herstellen einer Verbindung mit Universelles Drucken
  2. Abrufen der Liste der drucker von Interesse
  3. Gewähren des Benutzerzugriffs auf die Sammlung von Druckern
Connect-UPService
$Printers = Get-UPPrinter
$Printers.Results | Set-UPPrinterProperty -Latitude 47.642391 -Longitude -122.137001 -Organization "Contoso" -Site "Main Campus" -City "Redmond" -Building "101"

Verwenden von ContinuationToken

  1. Herstellen einer Verbindung mit Universelles Drucken
  2. Abrufen der Liste der drucker von Interesse
  3. Wenn ein intermittierender Fehler auftritt, werden Teilergebnisse zusammen mit einem Fortsetzungstoken zurückgegeben.
Connect-UPService
$Printers = Get-UPPrinter

"Get-UPPrinter :
At line:1 char:13
+ $Printers = Get-UPPrinter
+             ~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (System.Collecti...Models.Printer]:List`1) [Get-UPPrinter], FailedCmdletException
    + FullyQualifiedErrorId : Rerun with -ContinuationToken to continue from last cutoff: MyZRVkZCUVVGQlFVRXZMeTh2THk4dkx5OHZMMGxCUVVGQk5IQTRiR
   EY0YWpOdU1DdEtPSG94T1dwUWNHWm5kejA5,Microsoft.UPManagement.Cmdlets.GetPrinter"

$Printers.Results
"(Partial results list of printers)"

$Printers.ContinuationToken
"MyZRVkZCUVVGQlFVRXZMeTh2THk4dkx5OHZMMGxCUVVGQk5IQTRiREY0YWpOdU1DdEtPSG94T1dwUWNHWm5kejA5"

$MorePrinters = Get-UPPrinter -ContinuationToken $Printers.ContinuationToken
$MorePrinters.Results
"(Printer results list continued from previously left off)"
  1. Das ContinuationToken macht das Abrufen von Ergebnissen robuster. Wiederholungsversuche können hinzugefügt und aneinander angefügt werden. Beachten Sie, dass dies nur für Mandanten erforderlich ist, die über eine hohe Anzahl (~8000+) registrierter Drucker/Konnektoren/Freigaben/usw. verfügen und bei denen beim Durchlaufen der gesamten Liste wiederholt Fehler auftreten.
do
{
    $i = Get-UPPrinter -ContinuationToken $i.ContinuationToken 
    $allprinters += $i.Results
}
while (![string]::IsNullOrEmpty($i.ContinuationToken))

$allprinters.Results

Herunterladen erweiterter Benutzer- und Druckernutzungsberichte für den letzten Monat

  1. Stellen Sie sicher, dass das richtige Microsoft Graph Modul installiert ist.
  2. Anmelden bei Microsoft Graph
  3. Fordern Sie den erforderlichen Berechtigungsbereich "Reports.Read.All" an
  4. Sammeln und Exportieren des Druckerberichts
  5. Sammeln und Exportieren des Benutzerberichts
Param (
    # Date should be in this format: 2020-09-01
    # Default is the first day of the previous month at 00:00:00 (Tenant time zone)
    $StartDate = "",
    # Date should be in this format: 2020-09-30
    # Default is the last day of the previous month 23:59:59 (Tenant time zone)
    $EndDate = "",
    # Set if only the Printer report should be generated
    [switch]$PrinterOnly,
    # Set if only the User report should be generated
    [switch]$UserOnly
)

#############################
# INSTALL & IMPORT MODULES
#############################

if(-not (Get-Module Microsoft.Graph.Reports -ListAvailable)){
    Write-Progress -Activity "Installing Universal Print dependencies..." -PercentComplete 60
    Install-Module Microsoft.Graph.Reports -Scope CurrentUser -Force
}
Import-Module Microsoft.Graph.Reports

#############################
# SET DATE RANGE
#############################
if ($StartDate -eq "") {
    $StartDate = (Get-Date -Day 1).AddMonths(-1).ToString("yyyy-MM-ddT00:00:00Z")
} else {
    $StartDate = ([DateTime]$StartDate).ToString("yyyy-MM-ddT00:00:00Z")
}

if ($EndDate -eq "") {
    $EndDate = (Get-Date -Day 1).AddDays(-1).ToString("yyyy-MM-ddT23:59:59Z")
} else {
    $EndDate = ([DateTime]$EndDate).ToString("yyyy-MM-ddT23:59:59Z")
}

echo "Gathering reports between $StartDate and $EndDate."

########################################
# SIGN IN & CONNECT TO MICROSOFT GRAPH
########################################

# These scopes are needed to get the list of users, list of printers, and to read the reporting data.
Connect-MgGraph -Scopes "Reports.Read.All"

##########################
# GET PRINTER REPORT
##########################

if (!$UserOnly)
{
    Write-Progress -Activity "Gathering Printer usage..." -PercentComplete -1

    # Get the printer usage report
    $printerReport = Get-MgReportMonthlyPrintUsageByPrinter -All -Filter "completedJobCount gt 0 and usageDate ge $StartDate and usageDate lt $EndDate"

    ## Join extended printer info with the printer usage report
    $reportWithPrinterNames = $printerReport | 
        Select-Object ( 
            @{Name = "UsageMonth"; Expression = {$_.Id.Substring(0,8)}}, 
            @{Name = "PrinterId"; Expression = {$_.PrinterId}}, 
            @{Name = "DisplayName"; Expression = {$_.PrinterName}}, 
            @{Name = "TotalJobs"; Expression = {$_.CompletedJobCount}},
            @{Name = "ColorJobs"; Expression = {$_.CompletedColorJobCount}},
            @{Name = "BlackAndWhiteJobs"; Expression = {$_.CompletedBlackAndWhiteJobCount}},
            @{Name = "ColorPages"; Expression = {$_.ColorPageCount}},
            @{Name = "BlackAndWhitePages"; Expression = {$_.BlackAndWhitePageCount}},
            @{Name = "TotalSheets"; Expression = {$_.MediaSheetCount}})

    # Write the aggregated report CSV
    $printerReport | Export-Csv -Path .\printerReport.csv
}

##################
# GET USER REPORT
##################

if (!$PrinterOnly)
{
    Write-Progress -Activity "Gathering User usage..." -PercentComplete -1

    # Get the user usage report
    $userReport = Get-MgReportMonthlyPrintUsageByUser -All -Filter "completedJobCount gt 0 and usageDate ge $StartDate and usageDate lt $EndDate"
    $reportWithUserInfo = $userReport | 
        Select-Object ( 
            @{Name = "UsageMonth"; Expression = {$_.Id.Substring(0,8)}}, 
            @{Name = "UserPrincipalName"; Expression = {$_.UserPrincipalName}}, 
            @{Name = "TotalJobs"; Expression = {$_.CompletedJobCount}},
            @{Name = "ColorJobs"; Expression = {$_.CompletedColorJobCount}},
            @{Name = "BlackAndWhiteJobs"; Expression = {$_.CompletedBlackAndWhiteJobCount}},
            @{Name = "ColorPages"; Expression = {$_.ColorPageCount}},
            @{Name = "BlackAndWhitePages"; Expression = {$_.BlackAndWhitePageCount}},
            @{Name = "TotalSheets"; Expression = {$_.MediaSheetCount}})
			        
    $reportWithUserInfo | Export-Csv -Path .\userReport.csv
}

echo "Reports were written to 'printerReport.csv' and 'userReport.csv'."