sql >> Base de Datos >  >> RDS >> Sqlserver

Tipo de variable inesperado devuelto por Receive-Job

  1. ¿Hay alguna forma de obtener el tipo de variable correcto/esperado al llamar a Receive-Job? ?

Debido al uso de un trabajo en segundo plano, pierde fidelidad de tipo :los objetos que obtienes son emulaciones sin métodos de los tipos originales.

La recreación manual de los tipos originales no vale la pena y es posible que ni siquiera sea posible, aunque quizás trabajar con las emulaciones sea suficiente.

Actualizar :Según su propia respuesta, cambiar de trabajar con System.DataSet a System.DataTable resultó en emulaciones útiles para usted.

Consulte la sección inferior para obtener más información.

  1. ¿Existe una forma mejor de ejecutar consultas SQL en una cuenta de AD diferente, utilizando el comando Invoke-Sqlcmd?

Necesita un en proceso método de invocación para mantener la fidelidad de tipo , pero no creo que sea posible con comandos arbitrarios si desea suplantar a otro usuario .

Por ejemplo, la alternativa en proceso (basada en subprocesos) a Start-Job - Start-ThreadJob - no tiene una -Credential parámetro.

Por lo tanto, su mejor apuesta es intentar hacer Invoke-SqlCmd -Credential el parámetro funcione para usted o encuentre una forma diferente en el proceso de ejecutar sus consultas con las credenciales de un usuario determinado.

Serialización y deserialización de objetos en trabajos en segundo plano/remoting/mini-shells:

Cada vez que PowerShell ordena objetos a través de límites de proceso , emplea serialización basada en XML en el origen y deserialización en el destino , usando un formato conocido como CLI XML (Infraestructura de lenguaje común XML).

Esto sucede en el contexto de la conexión remota de PowerShell. (por ejemplo, Invoke-Command llamadas con el
-ComputerName parámetro) así como en trabajos en segundo plano (Start-Job ) y los llamados mini-conchas (que se usan implícitamente cuando llama a la CLI de PowerShell desde el propio PowerShell con un bloque de script; por ejemplo, powershell.exe { Get-Item / } ).

Esta deserialización mantiene la fidelidad de tipo solo para un conjunto limitado de tipos conocidos , como se especifica en MS-PSRP, la especificación del protocolo de comunicación remota de PowerShell. Es decir, solo las instancias de un conjunto fijo de tipos se deserializan como su tipo original .

Las instancias de todos los demás tipos son emulado :los tipos tipo lista se convierten en [System.Collections.ArrayList] instancias, los tipos de diccionario se convierten en [hasthable] instancias y otros tipos se convierten en objetos personalizados sin métodos (solo propiedades) ([pscustomobject] instancias) , cuyos .pstypenames La propiedad contiene el nombre del tipo original con el prefijo Deserialized. (por ejemplo, Deserialized.System.Data.DataTable ), así como los nombres igualmente prefijados de la base del tipo tipos (jerarquía de herencia).

Además, la profundidad de recurrencia para gráficos de objetos de non -[pscustomobject] las instancias están limitadas a 1 nivel - tenga en cuenta que esto incluye instancias de clases personalizadas de PowerShell , creado con la class palabra clave:es decir, si los valores de propiedad de un objeto de entrada no son instancias de tipos conocidos en sí mismos (este último incluye tipos de un solo valor, incluidos tipos primitivos de .NET como [int] , a diferencia de los tipos compuestos por varias propiedades), se reemplazan por su .ToString() representaciones (por ejemplo, escriba System.IO.DirectoryInfo tiene un .Parent propiedad que es otra System.IO.DirectoryInfo instancia, lo que significa que .Parent el valor de la propiedad se serializa como .ToString() representación de esa instancia, que es su cadena de ruta completa); en resumen:Los objetos no personalizados (escalares) se serializan de tal manera que los valores de propiedad que no son en sí mismos instancias de tipos conocidos se reemplazan por su .ToString() representación ; consulte esta respuesta para ver un ejemplo concreto.
Por el contrario, explícito uso de la serialización CLI XML a través de Export-Clixml por defecto a una profundidad de 2 (puede especificar una profundidad personalizada a través de -Depth y puede controlar la profundidad de manera similar si usa el System.Management.Automation.PSSerializer subyacente escribe directamente ).

Según el tipo de original, puede ser capaz de reconstruir instancias del tipo original manualmente , pero eso no está garantizado. (Puede obtener el nombre completo del tipo original llamando a .pstypenames[0] -replace '^Deserialized\.' en un objeto personalizado dado.)

Sin embargo, dependiendo de sus necesidades de procesamiento, las emulaciones de los objetos originales puede ser suficiente.