Delen via


Voorbeelden van PowerShell-use-case voor Universal Print

De UniversalPrintManagement PowerShell-module ondersteunt de vastgestelde PowerShell-scriptpatronen. In dit artikel worden enkele patronen beschreven als uitgangspunt voor hoe de cmdlets kunnen worden gecombineerd om gebruiksvoorbeelden aan te pakken.

Niet-interactieve Universal Print-verbinding

Een van de belangrijkste waarden voor het gebruik van PowerShell is het maken van niet-interactieve scripts die telkens opnieuw kunnen worden uitgevoerd. De noodzaak om de gebruikersreferenties in te voeren om de verbinding met Universal Print tot stand te brengen, gaat tegen dit idee. Een van de opties is dat u het wachtwoord van de gebruiker veilig opslaat en indien nodig ophaalt.

  1. Wachtwoordgeheim veilig opslaan in een bestand
  2. Wachtwoord ophalen vlak voordat u aanroept 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

Notitie

Aanvullende informatie over ConvertFrom-SecureString en ConvertTo-SecureString is hier beschikbaar.

De registratie van printers van een Verbinding maken or in Batch ongedaan maken

Ervan uitgaande dat u al de naam weet van de geregistreerde Verbinding maken or die wordt gebruikt om de printers te registreren. Raadpleeg de cmdlet Get-UP Verbinding maken or om de lijst met geregistreerde Verbinding maken ors op te halen.

  1. Verbinding maken naar Universal Print
  2. De lijst met printers ophalen die zijn geregistreerd via de specifieke Verbinding maken or
  3. De geregistreerde printer verwijderen
Connect-UPService
$ConnectorPrinters = Get-UPPrinter -IncludeConnectorDetails
$ConnectorPrinters.Results | Where-Object {$_.Connectors.DisplayName -Contains "<Connector Name>"} | Remove-UPPrinter

De geregistreerde printer achter een gedeelde printernaam identificeren

  1. Verbinding maken naar Universal Print
  2. De lijst met printers ophalen en lokale computer gebruiken om de resultaten te filteren
Connect-UPService
$Printers = Get-UPPrinter
$Printer = $Printers.Results | Where-Object {$_.Shares.DisplayName -eq "<Share Name>"}

Printers voor het delen van batchgewijs ongedaan maken

  1. Verbinding maken naar Universal Print
  2. De lijst met interessante printers ophalen
  3. Delen van de verzameling printers opheffen

Notitie

In dit voorbeeld ziet u dat alle gedeelde printers niet worden gedeeld. Als u het delen van alleen printers ongedaan wilt maken, kunnen extra filters worden toegevoegd bij het ophalen van de printers.

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

Batch verleent alle gebruikers toegang tot gedeelde printers

  1. Verbinding maken naar Universal Print
  2. De lijst met printershares van belang ophalen
  3. Gebruikers toegang verlenen tot de verzameling printers
Connect-UPService
$PrinterShares = Get-UPPrinterShare
$PrinterShares.Results | Grant-UPAccess -AllUsersAccess

Batch verleent gebruikers of gebruikersgroepen toegang tot gedeelde printers

  1. Opnieuw afsluiten: gebruikers-id's en gebruikersgroep-id's ophalen
  2. Verbinding maken naar Universal Print
  3. De lijst met printershares van belang ophalen
  4. Specifieke gebruikers of groepen toegang verlenen tot de verzameling printers
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}

Locatie-eigenschappen van batch-set printer

  1. Verbinding maken naar Universal Print
  2. De lijst met interessante printers ophalen
  3. Gebruikers toegang verlenen tot de verzameling printers
Connect-UPService
$Printers = Get-UPPrinter
$Printers.Results | Set-UPPrinterProperty -Latitude 47.642391 -Longitude -122.137001 -Organization "Contoso" -Site "Main Campus" -City "Redmond" -Building "101"

Vervolgtoken gebruiken

  1. Verbinding maken naar Universal Print
  2. De lijst met interessante printers ophalen
  3. Als er een onregelmatige fout optreedt, worden gedeeltelijke resultaten geretourneerd, samen met een vervolgtoken.
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. Het ContinuationToken maakt het aanroepen van resultaten robuuster. Nieuwe pogingen kunnen aan elkaar worden toegevoegd en toegevoegd. Houd er rekening mee dat dit alleen nodig is voor tenants met een groot aantal (~8000+) geregistreerde printers/connectors/shares/etc. en die consistente fouten ondervinden bij het doorlopen van de hele lijst.
do
{
    $i = Get-UPPrinter -ContinuationToken $i.ContinuationToken 
    $allprinters += $i.Results
}
while (![string]::IsNullOrEmpty($i.ContinuationToken))

$allprinters.Results

Uitgebreide gebruikers- en printergebruiksrapporten voor de afgelopen maand downloaden

  1. Zorg ervoor dat de juiste Microsoft Graph-module is geïnstalleerd
  2. Aanmelden bij Microsoft Graph
  3. Vraag het vereiste autorisatiebereik Reports.Read.All aan
  4. Het printerrapport verzamelen en exporteren
  5. Het gebruikersrapport verzamelen en exporteren
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'."