Partilhar via


Exemplos de casos de uso do Universal Print PowerShell

O módulo UniversalPrintManagement PowerShell suporta os padrões de script do PowerShell estabelecidos. Este artigo mostra alguns padrões como ponto de partida de como os cmdlets podem ser combinados para lidar com casos de uso selecionados.

Ligação Universal Print não interativa

Um dos principais valores do uso do PowerShell é criar scripts não interativos que podem ser executados repetidamente. A necessidade de introduzir as credenciais do utilizador para estabelecer a ligação ao Universal Print vai contra esta ideia. Uma opção é o endereço que é armazenar o segredo da senha do usuário com segurança e recuperá-lo conforme necessário.

  1. Armazene com segurança a senha secreta de um arquivo
  2. Recuperar senha antes de ligar 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

Nota

Informações adicionais sobre ConvertFrom-SecureString e ConvertTo-SecureString estão disponíveis aqui.

Batch cancela o registro de impressoras de um conector

Supondo que você já saiba o nome do conector registrado usado para registrar as impressoras. Consulte o cmdlet Get-UPConnector para recuperar a lista de conectores registrados.

  1. Ligar ao Universal Print
  2. Obter a lista de impressoras registadas através do Conector específico
  3. Remover a impressora registada
Connect-UPService
$ConnectorPrinters = Get-UPPrinter -IncludeConnectorDetails
$ConnectorPrinters.Results | Where-Object {$_.Connectors.DisplayName -Contains "<Connector Name>"} | Remove-UPPrinter

Identificando a impressora registrada atrás de um nome de impressora compartilhado

  1. Ligar ao Universal Print
  2. Recuperar a lista de impressoras e usar a máquina local para filtrar os resultados
Connect-UPService
$Printers = Get-UPPrinter
$Printer = $Printers.Results | Where-Object {$_.Shares.DisplayName -eq "<Share Name>"}

Impressoras de cancelamento de compartilhamento em lote

  1. Ligar ao Universal Print
  2. Obter a lista de impressoras de interesse
  3. Cancelar o compartilhamento da coleção de impressoras

Nota

Este exemplo mostra o cancelamento do compartilhamento de todas as impressoras compartilhadas. Para cancelar o compartilhamento apenas de impressoras selecionadas, filtros adicionais podem ser adicionados ao recuperar as impressoras.

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

O lote concede a todos os usuários acesso a impressoras compartilhadas

  1. Ligar ao Universal Print
  2. Obtenha a lista de ações de impressão de interesse
  3. Conceder ao usuário acesso à coleção de impressoras
Connect-UPService
$PrinterShares = Get-UPPrinterShare
$PrinterShares.Results | Grant-UPAccess -AllUsersAccess

O lote concede aos usuários ou grupos de usuários acesso a impressoras compartilhadas

  1. Pré-retorno: recuperar IDs de usuário e IDs de grupo de usuários
  2. Ligar ao Universal Print
  3. Obtenha a lista de ações de impressão de interesse
  4. Conceder a usuários ou grupos específicos acesso à coleção de impressoras
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}

Propriedades do local da impressora do conjunto de lotes

  1. Ligar ao Universal Print
  2. Obter a lista de impressoras de interesse
  3. Conceder ao usuário acesso à coleção de impressoras
Connect-UPService
$Printers = Get-UPPrinter
$Printers.Results | Set-UPPrinterProperty -Latitude 47.642391 -Longitude -122.137001 -Organization "Contoso" -Site "Main Campus" -City "Redmond" -Building "101"

Usando ContinuationToken

  1. Ligar ao Universal Print
  2. Obter a lista de impressoras de interesse
  3. Se uma falha intermitente for encontrada, os resultados parciais serão retornados, juntamente com um token de continuação.
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. O ContinuationToken torna a chamada de resultados mais robusta. Podem ser adicionadas e acrescentadas novas tentativas. Observe que isso só é necessário para locatários que têm um alto número (~8000+) de impressoras/conectores/compartilhamentos/etc. registrados e estão enfrentando falhas consistentes ao iterar por toda a lista.
do
{
    $i = Get-UPPrinter -ContinuationToken $i.ContinuationToken 
    $allprinters += $i.Results
}
while (![string]::IsNullOrEmpty($i.ContinuationToken))

$allprinters.Results

Baixar relatórios estendidos de uso de usuários e impressoras do último mês

  1. Verifique se o módulo correto do Microsoft Graph está instalado
  2. Entrar no Microsoft Graph
  3. Solicite o escopo de autorização "Reports.Read.All" necessário
  4. Reunir e exportar o relatório da impressora
  5. Reunir & exportar o relatório de usuário
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'."