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.
- Armazene com segurança a senha secreta de um arquivo
- 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.
- Ligar ao Universal Print
- Obter a lista de impressoras registadas através do Conector específico
- 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
- Ligar ao Universal Print
- 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
- Ligar ao Universal Print
- Obter a lista de impressoras de interesse
- 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
- Ligar ao Universal Print
- Obtenha a lista de ações de impressão de interesse
- 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
- Pré-retorno: recuperar IDs de usuário e IDs de grupo de usuários
- Ligar ao Universal Print
- Obtenha a lista de ações de impressão de interesse
- 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
- Ligar ao Universal Print
- Obter a lista de impressoras de interesse
- 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
- Ligar ao Universal Print
- Obter a lista de impressoras de interesse
- 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)"
- 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
- Verifique se o módulo correto do Microsoft Graph está instalado
- Entrar no Microsoft Graph
- Solicite o escopo de autorização "Reports.Read.All" necessário
- Reunir e exportar o relatório da impressora
- 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'."