Recursos para Profesionales de TI >
Página principal de foros
>
Windows PowerShell
>
Dot-Sourcing a PowerShell script in .NET and then running a cmdlet defined in the script.
Dot-Sourcing a PowerShell script in .NET and then running a cmdlet defined in the script.
- The HyperV guys have a nice hyperv.ps1 script that contains definitions for cmdlets like (Get-VM, Get-VMHost etc. etc.).So in the PowerShell command line i dot source (. ./hyperv.ps1) then run 'Get-VM' and all is well.I'd like to do the same from .Net:Unfortunately I get a CommandNOtFoundException :"The term 'Get-VMHost' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again."
string scriptContents = string.Empty; using(StreamReader fs = new StreamReader(@"hyperv.ps1")) { scriptContents = fs.ReadToEnd(); } . . . . pipeline.Commands.AddScript("scriptContents"); pipeline.Command.Add(new Command("Get-VM")); pipeline.Invoke();
Thanks for your help in advance.Matt
Respuestas
- If you used IE to download this script, right-click on hyperv.ps1 and select "unblock". That might be your problem...
- Propuesto como respuestaMarco ShawMVP, Moderadorviernes, 26 de junio de 2009 19:11
- Marcado como respuestalushdog lunes, 29 de junio de 2009 19:44
Todas las respuestas
- That's a good one.
Since this is a runspace, I think I'd try this first by modifying the function in hyper.ps1:
Instead of:
function get-vm {...
}
Change it to:
function global:get-vm {...
}
Then when you load hyper.ps1, I think you will have access to the function in your current scope.
I don't know what might be the implications of changing *all* the functions to be in the global scope in this case.- Propuesto como respuestaMarco ShawMVP, Moderadorjueves, 25 de junio de 2009 18:31
- Votado como útilMarco ShawMVP, Moderadorviernes, 26 de junio de 2009 19:11
- I figured out that i should be loading the script in the runspace rather than the pipeline:
myRunspaceInvoke.Invoke(". ./hyperv.ps1");Unfortunately I get a "AuthorizationManager check failed." exception as I believe the script is not signed or some other authentication problem. - Are you using the new v2 CTP3 here?
Known problem:
https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=466285&SiteID=99- Votado como útilMarco ShawMVP, Moderadorviernes, 26 de junio de 2009 19:11
- Propuesto como respuestaMarco ShawMVP, Moderadorviernes, 26 de junio de 2009 13:38
- Nope I'm using Powershell 1.0.
I can't seem to find that feedback item you've linked.
Can you cut and paste the summary here so I can read it over? - I'll have to try some more testing with runspaces. This may be related directly to WMI though...
When the WMI service (winmgmt) is "paused", the policy execution equal to "AllSigned" and i run powershell.exe, i get this error :
-------
Windows PowerShell V2 (Community Technology Preview - Features Subject to Change)
Copyright (C) 2008 Microsoft Corporation. All rights reserved.
AuthorizationManager check failed.
At line:1 char:2
+ . <<<< 'C:\Documents and Settings\UserTest\Mes documents\WindowsPowerShell\profile.ps1'
+ CategoryInfo : NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId : RuntimeException
AuthorizationManager check failed.
At line:1 char:2
+ . <<<< 'C:\Documents and Settings\UserTest\Mes documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1'
+ CategoryInfo : NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId : RuntimeException- Propuesto como respuestaMarco ShawMVP, Moderadorviernes, 26 de junio de 2009 19:11
- Good call, but my service is running so I don't think this is the case for my issue.
I was thinking that perhaps it is due to the fact that even if you set the execution policy to allow any script to run, you are still prompted to allow a script to run:
Security Warning Run only scripts that you trust. While scripts from the Internet can be useful, this script can potentially harm your computer. Do you want to run C:\hyperv.ps1? [D] Do not run [R] Run once [S] Suspend [?] Help (default is "D"): r
Perhaps this is why the AuthorizationManager check fail is being raised as there is no user confirmation when dot-sourcing/running a script from .net. - If you used IE to download this script, right-click on hyperv.ps1 and select "unblock". That might be your problem...
- Propuesto como respuestaMarco ShawMVP, Moderadorviernes, 26 de junio de 2009 19:11
- Marcado como respuestalushdog lunes, 29 de junio de 2009 19:44
- Yep that got rid of the 'prompt' which made it work ok in .NET.Thanks for you help.On a side note I went with putting the cmdlet code from the .ps1 file into string resources in my .NET project as I do not want the need for the heightened priviledges required for dot-sourcing a script.

