c# powershell powershell-remoting cmdlets runspace

c# - ¿Cómo puedo alojar un script o aplicación de Powershell para que sea accesible a través de WSManConnectionInfo?(como Office 365)



powershell-remoting cmdlets (1)

Las únicas formas que conozco para conectarme a un espacio de ejecución remoto incluyen los siguientes parámetros

WSManConnectionInfo connectionInfo = new WSManConnectionInfo(false, "localhost", 80, "/Powershell", "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential);

o

WSManConnectionInfo connectionInfo = new WSManConnectionInfo(false, "localhost", 5985, "/wsman", "http://schemas.microsoft.com/powershell/Microsoft.Powershell", credential);

  • ¿Cómo configuro mi propio objeto Powershell personalizado para poder exponerlo a través de HTTP?

  • ¿Cuáles son los parámetros correctos para usar y cómo los configuro?


Hay varias piezas para esto, así que las explicaré por separado y luego las juntaré.

Imitación implícita

Intercambio está utilizando Imitación implícita .

La forma en que funciona es que establezca una PSSession en una máquina remota y luego importe algunos de los comandos disponibles desde la instancia remota a su cuenta.

Esto se hace usando Import-Module -Session $session o Import-PSSession .

Puedes probar esto por ti mismo puramente en Powershell. Use una estación de trabajo que no tenga instalado el RSAT de Active Directory (no tiene los cmdlets de ActiveDirectory powershell), luego conéctese a una máquina que sí lo tenga (llamémoslo DC1 ):

$s = New-PSSession -ComputerName DC1 Invoke-Command -Session $s -ScriptBlock { Import-Module ActiveDirectory } Import-PSSession -Session $s -Module ActiveDirectory

Restringir la llamada a Import-PSSession a solo un módulo le permite importar solo esos cmdlets. En este punto, podría ejecutar Get-ADComputer por ejemplo, como si estuviera disponible localmente, aunque la llamada real se está realizando en DC1 .

Configuraciones de sesión

Cuando realiza una conexión remota de powershell, se está conectando a una configuración de sesión. Si no especifica uno, se conecta a uno llamado Microsoft.PowerShell . Para ver todas las configuraciones que están definidas en una máquina, llame a Get-PSSessionConfiguration . Es posible que vea algunos otros, por ejemplo, Microsoft.PowerShell32 es una forma de conectarse a una sesión de PowerShell de 32 bits.

Para conectarse a una configuración específica, use New-PSSession -ConfigurationName o New-PSSession -ConnectionUri .

Definir configuraciones de sesión

Puedes especificar muchas cosas en una configuración de sesión; la versión de powershell, el bitness, los módulos que se importan previamente, puede predefinir las funciones y el código, puede evitar que las funciones de idioma estén disponibles, etc.

Esta respuesta proporciona una buena visión general de cómo crear su propia configuración .

También puede colocar información de configuración dentro de un ensamblaje, lo que funcionaría bien para lo que está tratando de hacer.

Código de envoltura en módulos

Como ha visto con Import-PSSession , es más fácil importar solo el código que desea si existe en un módulo. Por lo tanto, debe asegurarse de que su cmdlet esté expuesto a través de un módulo.

Dijo en un comentario que quería escribir su cmdlet en C #. Esto no es algo que haya hecho, pero este artículo parece proporcionar instrucciones detalladas sobre cómo crear un Módulo PowerShell en C # .

Esto es ahora algo que he hecho (y ese artículo es bueno). Escribir un cmdlet en C # es, implícitamente, ya un módulo. De hecho, puede usar Import-Module para cargar un ensamblado .NET compilado, ya sea que contenga o no cmdlets de PowerShell.

Por ejemplo, si creó una clase pública y la compiló en una DLL, puede hacer Import-Module MyAssembly.dll y esa clase ahora está disponible en su sesión de PowerShell.

Definir el cmdlet en C # significa incluir una referencia a System.management.Automation y luego crear una clase que hereda de PSCmdlet o PSCmdlet .

Se recomienda definir el manifiesto del módulo, pero técnicamente es opcional, igual que con un módulo de script.

Sin embargo, no he incluido la información de configuración de la sesión en un ensamblaje (¿todavía?), Ni he visto una referencia sobre cómo hacerlo.

Juntándolo

Los pasos deben parecerse aproximadamente a esto:

  1. Compile el módulo y haga que esté disponible en el extremo remoto, de modo que pueda importarse a powershell desde una sesión local en esa máquina.
  2. Cree un nuevo archivo de configuración de PSSession y especifique -AssembliesToLoad o -ModulesToImport (o ambos si es necesario), o especifique la información de configuración en el propio ensamblaje (probablemente se prefiere aquí).
  3. Registrar la configuración en la máquina.
  4. En el lado del cliente, quería ponerlo a disposición de PowerShell, así que simplemente crearía la sesión y luego la importaría:

$s = New-PSSession -ComputerName RemoteMachine -ConfigurationName MyConfig # The configuration was defined in such a way # that your module will already be imported in the remote session. Import-PSSession -Module MyModule

¿Simplificándolo?

No es necesario crear una configuración personalizada en el lado remoto. Siempre que su módulo esté disponible para cualquier sesión de powershell en la máquina remota, puede omitir los pasos de configuración de la sesión, y luego simplemente haría:

$s = New-PSSession -ComputerName RemoteMachine Invoke-Command -Session $s -ScriptBlock { Import-Module MyModule } Import-PSSession -Session $s -Module MyModule

Pero es posible que desee la personalización y el control adicionales que tiene al utilizar una configuración de sesión, por lo que depende de usted. Así es como lo hace el intercambio, pero puede ser excesivo para sus propósitos.