Tengo un script de PowerShell que uso para volcar listas de usuarios y computadoras en archivos csv; funciona muy bien y no quiero tocarlo mucho. Utiliza el cmdlet ActiveDirectory y los cmdlets Get-ADComputer y Get-ADUser.
He usado macros vb excel (2007) que llaman scripts de PowerShell antes. Ejemplo:
Sub test()
'
' test Macro
'
Set objShell = CreateObject("Wscript.Shell")
PSCommand1 = "Import-Module ActiveDirectory; "
objShell.Run "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command """ & PSCommand1 & """", 1, True
'
End Sub
Ahora, hago referencia específica al comando import-module allí porque hay una diferencia entre powershell VBA y powershell fuera de vba ... no se puede encontrar el módulo ActiveDirectory. Si agrego -noexit al comando de invocación de powershell para dejar el shell abierto después de que falle el comando, puedo escribir:
get-module -ListAvailable
Y el módulo ActiveDirectory no está en la lista. La variable de entorno muestra que está buscando módulos en los mismos lugares que una ventana de PowerShell normal (incluso en mi carpeta de usuario, por lo que se ejecuta en mi contexto). El módulo AD se muestra en -ListAvailable en una ventana de PowerShell normal.
Intenté modificar el comando import-module para direccionar el módulo AD real lo más directamente posible, y no puedo hacer que se cargue.
¿Alguien puede pensar en una forma de hacer que el módulo AD se muestre en una sesión de PowerShell iniciada desde una macro VB en Excel 2007?
fuente
Respuestas:
Esto es más fácil si utiliza .bat -> .ps1 Hacer un archivo bat para llamar a PowerShell debería ser fácil para alguien acostumbrado a trabajar con vba & PowerShell.
Haga que el .bat funcione con el PowerShell. Descubrir lo que se necesita para que funcione el .bat puede ser suficiente para mostrarle lo que necesita cambiar en el código vba; de lo contrario, solo use el .bat en el vba y todo debería estar bien.
fuente