ChatGPT解决这个技术问题 Extra ChatGPT

.ps1 cannot be loaded because the execution of scripts is disabled on this system

I run this code to execute PowerShell code from an ASP.NET application:

System.Management.Automation.Runspaces.Runspace runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace();
runspace.Open();
System.Management.Automation.Runspaces.Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(@"\\servername\path");

pipeline.Commands.Add("Out-String");

Collection<PSObject> results = pipeline.Invoke();

runspace.Close();

But I am getting an error:

.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.

The same code runs fine from a command prompt or a windows (Windows Forms) application.

you need only this run you powershell as administrator then run two below liens First Line: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -scope currentuser enter the Y for yes then second Line: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -scope LocalMachine again enter the Y for yes so, enjoy
This should not be a duplicate, in this question we are creating our own Runspace.. in the duplicate we are running in a normal powershell runspace, for those finding this, when you call RunspaceFactory.CreateRunspace you can provide a InitialSessionState where you set ExecutionPolicy to ExecutionPolicy.Unrestricted.

P
Peter Mortensen

Your script is blocked from executing due to the execution policy.

You need to run PowerShell as administrator and set it on the client PC to Unrestricted. You can do that by calling Invoke with:

Set-ExecutionPolicy Unrestricted

this doesn't work for me. Well, actually it does work if you set it for both 32 and 64 bits.
Follow the principle of least permission. At least set the policy to RemoteSigned before removing all restrictions on your security policy. If that doesn't work, then re-assess what your pain points are and why it isn't working. You can set unrestricted as a last resort, but it shouldn't be your starting point.
I had both 32 & 64 bit PS installed. I had to set execution policy on BOTH. eg C:\Windows\System32\WindowsPowerShell\v1.0\Powershell.exe AND C:\Windows\SysWOW64\WindowsPowerShell\v1.0\Powershell.exe. Life would be a little better if there was only one.
Thank you ! Still helpful after 8 years
Works well without much of a hassle.
J
Jon Crowell

There are certain scenarios in which you can follow the steps suggested in the other answers, verify that Execution Policy is set correctly, and still have your scripts fail. If this happens to you, you are probably on a 64-bit machine with both 32-bit and 64-bit versions of PowerShell, and the failure is happening on the version that doesn't have Execution Policy set. The setting does not apply to both versions, so you have to explicitly set it twice.

Look in your Windows directory for System32 and SysWOW64.

Repeat these steps for each directory:

Navigate to WindowsPowerShell\v1.0 and launch powershell.exe Check the current setting for ExecutionPolicy: Get-ExecutionPolicy -List Set the ExecutionPolicy for the level and scope you want, for example: Set-ExecutionPolicy -Scope LocalMachine Unrestricted

Note that you may need to run PowerShell as administrator depending on the scope you are trying to set the policy for.


This is the best answer
Set-ExecutionPolicy -Scope Process Unrestricted works for me
Set-ExecutionPolicy -Scope CurrentUser Unrestricted worked for me
This solved it for me (on a 64-bit machine)
This answer actually led me to what was giving me the same Error message. I was running a powershell script with a scheduled task, but rather than use my windows user to run the script, I was using another account (a service account). I had to log in as that account and unrestrict the scripts for that user as well.
M
Matthew Steeples

The problem is that the execution policy is set on a per user basis. You'll need to run the following command in your application every time you run it to enable it to work:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned

There probably is a way to set this for the ASP.NET user as well, but this way means that you're not opening up your whole system, just your application.

(Source)


This works in VScode PowerShell console with Windows 10
P
Peter Mortensen

You need to run Set-ExecutionPolicy:

Set-ExecutionPolicy Unrestricted <-- Will allow unsigned PowerShell scripts to run.

Set-ExecutionPolicy Restricted <-- Will not allow unsigned PowerShell scripts to run.

Set-ExecutionPolicy RemoteSigned <-- Will allow only remotely signed PowerShell scripts to run.

a
avolkmann

I had a similar issue and noted that the default cmd on Windows Server 2012 was running the x64 one.

For Windows 7, Windows 8, Windows Server 2008 R2 or Windows Server 2012, run the following commands as Administrator:

x86

Open C:\Windows\SysWOW64\cmd.exe Run the command: powershell Set-ExecutionPolicy RemoteSigned

x64

Open C:\Windows\system32\cmd.exe Run the command powershell Set-ExecutionPolicy RemoteSigned

You can check mode using

In CMD: echo %PROCESSOR_ARCHITECTURE% In Powershell: [Environment]::Is64BitProcess

I hope this helps you.


B
Brended_99

Try This:

Set-ExecutionPolicy -scope CurrentUser Unrestricted

Please read How do I write a good answer?. While this code block may answer the OP's question, this answer would be much more useful if you explain how this code is different from the code in the question, what you've changed, why you've changed it and why that solves the problem without introducing others.