Compartilhar via


Exemplos de caso de uso do PowerShell de impressão universal

O módulo do PowerShell UniversalPrintManagement oferece suporte aos 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.

Conexão de impressão universal não interativa

Um dos principais valores do uso do PowerShell é criar scripts não interativos que podem ser executados repetidamente. A necessidade de inserir as credenciais do usuário para estabelecer a conexão com o Universal Print vai contra essa 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 o segredo da senha em 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

Observação

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

Cancelar o registro de impressoras de um conector em lote

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. Conectar-se ao Universal Print
  2. Obter a lista de impressoras registadas através do Conector específico
  3. Remova a impressora registrada
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. Conectar-se ao Universal Print
  2. Recupere a lista de impressoras e use o computador 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. Conectar-se ao Universal Print
  2. Obtenha a lista de impressoras de interesse
  3. Cancelar o compartilhamento da coleção de impressoras

Observação

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

Lote conceder a todos os usuários acesso a impressoras compartilhadas

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

Conceder acesso em lote a usuários ou grupos de usuários a impressoras compartilhadas

  1. Pré-requite: Recuperar IDs de usuário e IDs de grupo de usuários
  2. Conectar-se ao Universal Print
  3. Obtenha a lista de compartilhamentos de impressoras de interesse
  4. Conceder acesso a usuários ou grupos específicos à 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 de localização da impressora do conjunto de lotes

  1. Conectar-se ao Universal Print
  2. Obtenha 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. Conectar-se ao Universal Print
  2. Obtenha 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 por resultados mais robusta. As novas tentativas podem ser adicionadas e anexadas umas às outras. Observe que isso só é necessário para locatários que têm um número alto (~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ário e impressora do último mês

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