Beispiele für PowerShell-Anwendungsfälle in Universelles Drucken
Das PowerShell-Modul UniversalPrintManagement unterstützt die gängigen PowerShell-Skriptmuster. Dieser Artikel zeigt einige Muster als Ausgangspunkt dafür, wie die Cmdlets zur Bewältigung ausgewählter Anwendungsfälle kombiniert werden können.
Nicht-interaktive Universelles Drucken-Verbindung
Einer der Hauptvorteile von PowerShell ist die Erstellung nicht-interaktiver Skripts, die immer wieder ausgeführt werden können. Die Notwendigkeit, die Benutzerdaten einzugeben, um die Verbindung zu Universelles Drucken herzustellen, widerspricht diesem Gedanken. Eine Möglichkeit, dieses Problem zu lösen, besteht darin, das Benutzerkennwort sicher zu speichern und es bei Bedarf abzurufen.
- Sicheres Speichern des Passwortgeheimnisses in einer Datei
- Abrufen des Passworts direkt vor dem Aufrufen von
Connect-UPService
$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 über ConvertFrom-SecureString
und ConvertTo-SecureString
finden Sie hier.
Stapelweise Aufhebung der Registrierung von Druckern eines Connectors
Vorausgesetzt, Sie kennen den Namen des registrierten Connectors, der zur Registrierung der Drucker verwendet wird, bereits, können Sie die Liste der registrierten Connectors mit dem Cmdlet Get-UPConnector abrufen.
- Verbinden mit Universelles Drucken
- Abrufen der Liste der über den jeweiligen Connector registrierten Drucker
- 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
- Verbinden mit Universelles Drucken
- Abrufen der Druckerliste und Filtern der Ergebnisse auf dem lokalen Computer
Connect-UPService
$Printers = Get-UPPrinter
$Printer = $Printers.Results | Where-Object {$_.Shares.DisplayName -eq "<Share Name>"}
Stapelweise Freigabe der Drucker aufheben
- Verbinden mit Universelles Drucken
- Abrufen der Liste der Drucker von Interesse
- Freigabe der Druckersammlung
Hinweis
In diesem Beispiel wird die Aufhebung der Freigabe aller freigegebenen Drucker dargestellt. Um nur ausgewählte Drucker freizugeben, können beim Abrufen der Drucker zusätzliche Filter hinzugefügt werden.
Connect-UPService
$Printers = Get-UPPrinter
$Printers.Results.Shares | Remove-UPPrinterShare
Ein Batch gewährt allen Benutzern Zugriff auf die freigegebenen Drucker.
- Verbinden mit Universelles Drucken
- Abrufen der Liste der Druckeranteile von Interesse
- Benutzern den Zugriff auf die Druckersammlung gewähren
Connect-UPService
$PrinterShares = Get-UPPrinterShare
$PrinterShares.Results | Grant-UPAccess -AllUsersAccess
Ein Batch gewährt allen Benutzern oder Benutzergruppen Zugriff auf die freigegebenen Drucker.
- Voranfrage: Abrufen von Benutzer-IDs und Benutzergruppen-IDs
- Verbinden mit Universelles Drucken
- Abrufen der Liste der Druckeranteile von Interesse
- Bestimmten Benutzern oder Benutzergruppen den Zugriff auf die Druckersammlung gewähren
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}
Batchverarbeitung der Druckerstandorteigenschaften
- Verbinden mit Universelles Drucken
- Abrufen der Liste der Drucker von Interesse
- Benutzern den Zugriff auf die Druckersammlung gewähren
Connect-UPService
$Printers = Get-UPPrinter
$Printers.Results | Set-UPPrinterProperty -Latitude 47.642391 -Longitude -122.137001 -Organization "Contoso" -Site "Main Campus" -City "Redmond" -Building "101"
Verwendung von ContinuationToken
- Verbinden mit Universelles Drucken
- Abrufen der Liste der Drucker von Interesse
- Wenn ein intermittierender Fehler auftritt, werden Teilergebnisse zusammen mit einem Fortsetzungs-Token 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)"
- Der ContinuationToken macht den Abruf von Ergebnissen stabiler. Wiederholungsversuche können hinzugefügt und aneinander gehängt werden. Beachten Sie, dass dies nur für Mandanten erforderlich ist, die eine hohe Anzahl (über ~8000) von registrierten Druckern, Connectors, Freigaben usw. aufweisen und beim Durchlaufen der gesamten Liste konsistente 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
- Stellen Sie sicher, dass das richtige Microsoft Graph-Modul installiert ist
- Melden Sie sich bei Microsoft Graph an
- Fordern Sie den erforderlichen Autorisierungsbereich „Reports.Read.All“ an
- Sammeln und Exportieren Sie den Druckerbericht
- Sammeln und Exportieren Sie den Benutzerbericht
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'."