Compartir a través de


Register-ObjectEvent

Se suscribe a los eventos generados por un objeto de Microsoft .NET Framework.

Sintaxis

Register-ObjectEvent
        [-InputObject] <PSObject>
        [-EventName] <String>
        [[-SourceIdentifier] <String>]
        [[-Action] <ScriptBlock>]
        [-MessageData <PSObject>]
        [-SupportEvent]
        [-Forward]
        [-MaxTriggerCount <Int32>]
        [<CommonParameters>]

Description

El cmdlet Register-ObjectEvent se suscribe a eventos generados por objetos .NET en el equipo local o en un equipo remoto.

Cuando se genera el evento suscrito, se agrega a la cola de eventos de la sesión. Para obtener eventos en la cola de eventos, use el cmdlet Get-Event.

Puede usar los parámetros de Register-ObjectEvent para especificar los valores de propiedad de los eventos que pueden ayudarle a identificar el evento en la cola. También puede usar el parámetro Action para especificar las acciones que se deben realizar cuando se genera un evento suscrito y el parámetro Forward para enviar eventos remotos a la cola de eventos en la sesión local.

Cuando se suscribe a un evento, se agrega un suscriptor de eventos a la sesión. Para obtener los suscriptores de eventos en la sesión, use el cmdlet Get-EventSubscriber. Para cancelar la suscripción, use el cmdlet Unregister-Event, que elimina el suscriptor de eventos de la sesión.

Ejemplos

Ejemplo 1: Suscribirse a eventos cuando se inicia un nuevo proceso

En este ejemplo se suscribe a eventos generados cuando se inicia un nuevo proceso.

El comando usa el objeto managementEventWatcher de para obtener eventos EventArrived. Un objeto de consulta especifica que los eventos son eventos de creación de instancias para la clase Win32_Process.

$queryParameters = '__InstanceCreationEvent', (New-Object TimeSpan 0,0,1),
    "TargetInstance isa 'Win32_Process'"
$Query = New-Object System.Management.WqlEventQuery -ArgumentList $queryParameters
$ProcessWatcher = New-Object System.Management.ManagementEventWatcher $Query
Register-ObjectEvent -InputObject $ProcessWatcher -EventName "EventArrived"

Ejemplo 2: Especificar una acción para responder a un evento

Al especificar una acción, los eventos que se generan no se agregan a la cola de eventos. En su lugar, la acción responde al evento . En este ejemplo, cuando se genera un evento de creación de instancias que indica que se inicia un nuevo proceso, se genera un nuevo evento ProcessCreated.

$queryParameters = '__InstanceCreationEvent', (New-Object TimeSpan 0,0,1),
    "TargetInstance isa 'Win32_Process'"
$Query = New-Object System.Management.WqlEventQuery -ArgumentList $queryParameters
$ProcessWatcher = New-Object System.Management.ManagementEventWatcher $query
$newEventArgs = @{
    SourceIdentifier = 'PowerShell.ProcessCreated'
    Sender = $Sender
    EventArguments = $EventArgs.NewEvent.TargetInstance
}
$Action = { New-Event @newEventArgs }
Register-ObjectEvent -InputObject $ProcessWatcher -EventName "EventArrived" -Action $Action

Id   Name               PSJobTypeName   State       HasMoreData   Location   Command
--   ----               -------------   -----       -----------   --------   -------
 5   3db2d67a-efff-...                 NotStarted   False                    New-Event @newEventArgs

La acción usa el $Sender y $EventArgs variables automáticas que se rellenan solo para las acciones de evento.

El comando Register-ObjectEvent devuelve un objeto de trabajo que representa la acción, que se ejecuta como un trabajo en segundo plano. Puede usar los cmdlets job, como Get-Job y Receive-Job, para administrar el trabajo en segundo plano. Para obtener más información, vea about_Jobs.

Ejemplo 3: Suscribirse a eventos de objeto en equipos remotos

En este ejemplo se muestra cómo suscribirse a eventos de objeto en equipos remotos. En este ejemplo se usa la función Enable-ProcessCreationEvent que se define en el archivo de script de ProcessCreationEvent.ps1. Este script está disponible para todos los equipos del ejemplo.

# ProcessCreationEvent.ps1
function  Enable-ProcessCreationEvent {
    $queryParameters = "__InstanceCreationEvent", (New-Object TimeSpan 0,0,1),
        "TargetInstance isa 'Win32_Process'"
    $Query = New-Object System.Management.WqlEventQuery -ArgumentList $queryParameters

    $objectEventArgs = @{
        Input = New-Object System.Management.ManagementEventWatcher $Query
        EventName = 'EventArrived'
        SourceIdentifier = 'WMI.ProcessCreated'
        MessageData = 'Test'
        Forward = $True
    }
    Register-ObjectEvent @objectEventArgs
}

$S = New-PSSession -ComputerName "Server01, Server02"
Invoke-Command -Session $S -FilePath ProcessCreationEvent.ps1
Invoke-Command -Session $S { Enable-ProcessCreationEvent }

La primera que creamos PSSessions en dos equipos remotos y las guardamos en la variable $S. A continuación, el cmdlet Invoke-Command ejecuta el script de ProcessCreationEvent.ps1 en cada una de las PSSessions de $S. Esta acción crea la función Enable-ProcessCreationEvent en las sesiones remotas. Por último, ejecutamos la función Enable-ProcessCreationEvent en las sesiones remotas.

La función incluye un comando Register-ObjectEvent que se suscribe a eventos de creación de instancias en el objeto Win32_Process a través del objeto ManagementEventWatcher y su evento EventArrived.

Ejemplo 4: Uso del módulo dinámico en el objeto PSEventJob

En este ejemplo se muestra cómo usar el módulo dinámico en el objeto PSEventJob que se crea al incluir un action de en un registro de eventos. Primero creamos y habilitamos un objeto de temporizador y, a continuación, establecemos el intervalo del temporizador en 500 (milisegundos). El cmdlet registra el evento transcurrido del objeto de temporizador. El objeto PSEventJob se guarda en la variable y también está disponible en la propiedad Action del suscriptor de eventos. Para obtener más información, vea Get-EventSubscriber.

Cada vez que transcurre el intervalo del temporizador, se genera un evento y se ejecuta la acción. En este caso, el cmdlet Get-Random genera un número aleatorio entre 0 y 100 y lo guarda en la variable $Random.

$Timer = New-Object Timers.Timer
$Timer.Interval = 500
$Timer.Enabled = $True
$objectEventArgs = @{
    InputObject = $Timer
    EventName = 'Elapsed'
    SourceIdentifier = 'Timer.Random'
    Action = {$Random = Get-Random -Min 0 -Max 100}
}
$Job = Register-ObjectEvent @objectEventArgs
$Job | Format-List -Property *
& $Job.module {$Random}
& $Job.module {$Random}

State         : Running
Module        : __DynamicModule_53113769-31f2-42dc-830b-8749325e28d6
StatusMessage :
HasMoreData   : True
Location      :
Command       : $Random = Get-Random -Min 0 -Max 100
JobStateInfo  : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : 47b5ec9f-bfe3-4605-860a-4674e5d44ca8
Id            : 7
Name          : Timer.Random
ChildJobs     : {}
PSBeginTime   : 6/27/2019 10:19:06 AM
PSEndTime     :
PSJobTypeName :
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}
Information   : {}
60
47

El PSEventJob de tiene una propiedad Module que contiene un módulo de script dinámico que implementa la acción. Con el operador de llamada (&), invocamos el comando en el módulo para mostrar el valor de la variable $Random.

Para obtener más información sobre los módulos, consulte about_Modules.

Parámetros

-Action

Especifica los comandos para controlar el evento. Los comandos de Action se ejecutan cuando se genera un evento, en lugar de enviar el evento a la cola de eventos. Incluya los comandos entre llaves ( { } ) para crear un bloque de script.

El valor del parámetro Action de puede incluir las variables automáticas , , , y automáticas. Estas variables proporcionan información sobre el evento en el bloque de script acción de . Para obtener más información, vea about_Automatic_Variables.

Al especificar una acción, Register-ObjectEvent devuelve un objeto de trabajo de evento que representa esa acción. Puede usar los cmdlets job para administrar el trabajo de evento.

Tipo:ScriptBlock
Posición:101
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-EventName

Especifica el evento al que se va a suscribir.

El valor de este parámetro debe ser el nombre del evento que expone el objeto .NET. Por ejemplo, la clase managementEventWatcher de tiene eventos denominados EventArrived y Detenido. Para buscar el nombre del evento de un evento, use el cmdlet Get-Member.

Tipo:String
Posición:1
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Forward

Indica que el cmdlet envía eventos para esta suscripción a una sesión remota. Use este parámetro cuando se registren eventos en un equipo remoto o en una sesión remota.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-InputObject

Especifica el objeto .NET que genera los eventos. Escriba una variable que contenga el objeto o escriba un comando o expresión que obtenga el objeto .

Tipo:PSObject
Posición:0
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-MaxTriggerCount

Especifica el número máximo de veces que se puede desencadenar un evento.

Tipo:Int32
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-MessageData

Especifica los datos adicionales que se van a asociar a esta suscripción de eventos. El valor de este parámetro aparece en la propiedad MessageData de todos los eventos asociados a esta suscripción.

Tipo:PSObject
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-SourceIdentifier

Especifica un nombre que seleccione para la suscripción. El nombre que seleccione debe ser único en la sesión actual. El valor predeterminado es el GUID que asigna PowerShell.

El valor de este parámetro aparece en el valor del SourceIdentifier propiedad del objeto de suscriptor y todos los objetos de evento asociados a esta suscripción.

Tipo:String
Posición:100
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-SupportEvent

Indica que el cmdlet oculta la suscripción de eventos. Use este parámetro cuando la suscripción actual forme parte de un mecanismo de registro de eventos más complejo y no se debe detectar de forma independiente.

Para ver o cancelar una suscripción que se creó con el parámetro supportEvent , use el parámetro Force de los cmdlets y .

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

Entradas

None

No se pueden canalizar objetos a Register-ObjectEvent.

Salidas

None or System.Management.Automation.PSEventJob

Al usar el parámetro Action , devuelve un objeto System.Management.Automation.PSEventJob. De lo contrario, no genera ninguna salida.

Notas

Los eventos, las suscripciones de eventos y la cola de eventos solo existen en la sesión actual. Si cierra la sesión actual, se descarta la cola de eventos y se cancela la suscripción de eventos.