Compartir a través de


Ejemplos de casos de uso de PowerShell de impresión universal

El módulo universalPrintManagement de PowerShell admite los patrones de scripting de PowerShell establecidos. En este artículo se muestran algunos patrones como punto de partida de cómo se pueden combinar los cmdlets para abordar casos de uso seleccionados.

Conexión de impresión universal no interactiva

Uno de los principales valores de uso de PowerShell es crear scripts no interactivos que se pueden ejecutar de nuevo. La necesidad de escribir las credenciales de usuario para establecer la conexión a Impresión universal va en contra de esta idea. Una opción es solucionar esto es almacenar el secreto de contraseña de usuario de forma segura y recuperarlo según sea necesario.

  1. Almacenar de forma segura el secreto de contraseña en un archivo
  2. Recuperar contraseña justo antes de llamar 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:

Aquí encontrará información adicional sobre ConvertFrom-SecureString y ConvertTo-SecureString .

Anular el registro de impresoras por lotes de un Conectar or

Suponiendo que ya conoce el nombre del Conectar registrado usado para registrar las impresoras. Consulte el cmdlet Get-UP Conectar or para recuperar la lista de Conectar ors registrados.

  1. Conectar a impresión universal
  2. Obtener la lista de impresoras registradas a través del Conectar particular
  3. Quitar la impresora registrada
Connect-UPService
$ConnectorPrinters = Get-UPPrinter -IncludeConnectorDetails
$ConnectorPrinters.Results | Where-Object {$_.Connectors.DisplayName -Contains "<Connector Name>"} | Remove-UPPrinter

Identificación de la impresora registrada detrás de un nombre de impresora compartido

  1. Conectar a impresión universal
  2. Recuperar la lista de impresoras y usar la máquina local para filtrar los resultados
Connect-UPService
$Printers = Get-UPPrinter
$Printer = $Printers.Results | Where-Object {$_.Shares.DisplayName -eq "<Share Name>"}

Impresoras sin compartir por lotes

  1. Conectar a impresión universal
  2. Obtener la lista de impresoras de interés
  3. Descompartir la colección de impresoras

Nota:

En este ejemplo se muestra el uso compartido de todas las impresoras compartidas. Para anular el uso compartido solo de impresoras, se pueden agregar filtros adicionales al recuperar las impresoras.

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

Batch concede a todos los usuarios acceso a impresoras compartidas

  1. Conectar a impresión universal
  2. Obtener la lista de recursos compartidos de impresora de interés
  3. Concesión de acceso de usuario a la colección de impresoras
Connect-UPService
$PrinterShares = Get-UPPrinterShare
$PrinterShares.Results | Grant-UPAccess -AllUsersAccess

Batch concede a los usuarios o grupos de usuarios acceso a impresoras compartidas

  1. Solicitud previa: Recuperación de identificadores de usuario e identificadores de grupo de usuarios
  2. Conectar a impresión universal
  3. Obtener la lista de recursos compartidos de impresora de interés
  4. Conceder acceso a usuarios o grupos específicos a la colección de impresoras
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}

Propiedades de ubicación de la impresora del conjunto de lotes

  1. Conectar a impresión universal
  2. Obtener la lista de impresoras de interés
  3. Concesión de acceso de usuario a la colección de impresoras
Connect-UPService
$Printers = Get-UPPrinter
$Printers.Results | Set-UPPrinterProperty -Latitude 47.642391 -Longitude -122.137001 -Organization "Contoso" -Site "Main Campus" -City "Redmond" -Building "101"

Uso de ContinuationToken

  1. Conectar a impresión universal
  2. Obtener la lista de impresoras de interés
  3. Si se encuentra un error intermitente, se devolverán resultados parciales, junto con un token de continuación.
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. ContinuationToken hace que la llamada a los resultados sea más sólida. Los reintentos se pueden agregar y anexar entre sí. Tenga en cuenta que esto solo es necesario para los inquilinos que tienen un número alto (~8000+) de impresoras o conectores registrados/recursos compartidos/etc. y experimentan errores coherentes al iterar por toda la lista.
do
{
    $i = Get-UPPrinter -ContinuationToken $i.ContinuationToken 
    $allprinters += $i.Results
}
while (![string]::IsNullOrEmpty($i.ContinuationToken))

$allprinters.Results

Descarga de informes extendidos de uso de usuario e impresora para el último mes

  1. Asegúrese de que el módulo de Microsoft Graph correcto está instalado.
  2. Iniciar sesión en Microsoft Graph
  3. Solicite el ámbito de autorización "Reports.Read.All" necesario.
  4. Recopilar y exportar el informe impresora
  5. Recopilar y exportar el informe de usuario
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'."