Ответ 1
Если текущая консоль не поднята, а операция, которую вы пытаетесь выполнить, требует повышенных привилегий, тогда вы можете запустить powershell с помощью опции "Запуск от имени администратора"
PS> Start-Process powershell -Verb runAs
Вы знаете, что, если вы являетесь административным пользователем системы, и вы можете просто щелкнуть правой кнопкой мыши, сказать пакет script и запустить его как Администратор без ввода пароля администратора?
Мне интересно, как это сделать с помощью PowerShell script. Я не хочу вводить свой пароль; Я просто хочу подражать правой клавише мыши Запустить метод "Администратор".
Все, что я читал до сих пор, требует, чтобы вы предоставили пароль администратора.
Если текущая консоль не поднята, а операция, которую вы пытаетесь выполнить, требует повышенных привилегий, тогда вы можете запустить powershell с помощью опции "Запуск от имени администратора"
PS> Start-Process powershell -Verb runAs
Вот дополнение к предложению Шая Леви (просто добавьте эти строки в начало script):
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}
Это приводит к тому, что текущий script передается новому процессу powershell в режиме администратора (если текущий пользователь имеет доступ к режиму администратора, а script не запускается как администратор).
Windows 8.1/PowerShell 4.0 +
Одна строка:)
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }
# Your script here
Бенджамин Армстронг опубликовал отличную статью о самоподъемных сценариях PowerShell. Есть несколько незначительных проблем с его кодом; измененная версия на основе исправлений, предложенных в комментарии ниже.
В основном он получает идентификатор, связанный с текущим процессом, проверяет, является ли он администратором, а если нет, создает новый процесс PowerShell с правами администратора и завершает старый процесс.
# Get the ID and security principal of the current user account
$myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent();
$myWindowsPrincipal = New-Object System.Security.Principal.WindowsPrincipal($myWindowsID);
# Get the security principal for the administrator role
$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator;
# Check to see if we are currently running as an administrator
if ($myWindowsPrincipal.IsInRole($adminRole))
{
# We are running as an administrator, so change the title and background colour to indicate this
$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)";
$Host.UI.RawUI.BackgroundColor = "DarkBlue";
Clear-Host;
}
else {
# We are not running as an administrator, so relaunch as administrator
# Create a new process object that starts PowerShell
$newProcess = New-Object System.Diagnostics.ProcessStartInfo "PowerShell";
# Specify the current script path and name as a parameter with added scope and support for scripts with spaces in it path
$newProcess.Arguments = "& '" + $script:MyInvocation.MyCommand.Path + "'"
# Indicate that the process should be elevated
$newProcess.Verb = "runas";
# Start the new process
[System.Diagnostics.Process]::Start($newProcess);
# Exit from the current, unelevated, process
Exit;
}
# Run your code that needs to be elevated here...
Write-Host -NoNewLine "Press any key to continue...";
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown");
Вы можете создать пакетный файл (*.bat
), который запускает ваш скрипт powershell с правами администратора при двойном щелчке. Таким образом, вам не нужно ничего менять в вашем скрипте powershell. Для этого создайте командный файл с тем же именем и расположением вашего скрипта powershell, а затем поместите в него следующее содержимое:
@echo off
set scriptFileName=%~n0
set scriptFolderPath=%~dp0
set powershellScriptFileName=%scriptFileName%.ps1
powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command '\"cd \'\"%scriptFolderPath%\'\"; & \'\".\%powershellScriptFileName%\'\"'\"\" -Verb RunAs"
Это!
Вот объяснение:
Предполагая, что ваш скрипт powershell находится по пути C:\Temp\ScriptTest.ps1
, ваш командный файл должен иметь путь C:\Temp\ScriptTest.bat
. Когда кто-нибудь выполнит этот командный файл, произойдут следующие шаги:
Cmd выполнит команду
powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command '\"cd \'\"C:\Temp\'\"; & \'\".\ScriptTest.ps1\'\"'\"\" -Verb RunAs"
Откроется новый сеанс powershell, и будет выполнена следующая команда:
Start-Process powershell "-ExecutionPolicy Bypass -NoProfile -NoExit -Command '"cd \'"C:\Temp\'"; & \'".\ScriptTest.ps1\'"'"" -Verb RunAs
Еще один новый сеанс powershell с правами администратора откроется в папке system32
и ему будут переданы следующие аргументы:
-ExecutionPolicy Bypass -NoProfile -NoExit -Command "cd \"C:\Temp\"; & \".\ScriptTest.ps1\""
Следующая команда будет выполнена с правами администратора:
cd "C:\Temp"; & ".\ScriptTest.ps1"
Когда аргументы пути и имени сценария заключены в двойные кавычки, они могут содержать пробел или одинарные кавычки ('
).
Текущая папка изменится с system32
на C:\Temp
и будет выполнен скрипт ScriptTest.ps1
. После -NoExit
параметра -NoExit
окно не будет закрыто, даже если ваш скрипт powershell выдает какое-то исключение.
Вы можете легко добавить некоторые записи в реестре, чтобы получить контекстное меню "Запуск от имени администратора" для файлов .ps1
:
New-Item -Path "Registry::HKEY_CLASSES_ROOT\Microsoft.PowershellScript.1\Shell\runas\command" `
-Force -Name '' -Value '"c:\windows\system32\windowspowershell\v1.0\powershell.exe" -noexit "%1"'
(обновлено до более простого script от @Shay)
В основном в HKCR:\Microsoft.PowershellScript.1\Shell\runas\command
установите значение по умолчанию для вызова script с помощью Powershell.
С помощью
#Requires -RunAsAdministrator
пока не заявлено. Вроде бы там только начиная с PowerShell 4.0.
http://technet.microsoft.com/en-us/library/hh847765.aspx
Когда этот параметр переключателя добавляется в ваш оператор require, он указывает, что сеанс Windows PowerShell, в котором вы запускаете сценарий, должен быть запущен с повышенными правами пользователя (Запуск от имени администратора).
Мне кажется, это хороший способ сделать это, но я пока не уверен в полевом опыте. Среда выполнения PowerShell 3.0, вероятно, игнорирует это или, что еще хуже, выдает ошибку.
Когда скрипт запускается как не администратор, выдается следующая ошибка:
Сценарий 'StackOverflow.ps1' не может быть запущен, поскольку он содержит оператор "#requires" для запуска с правами администратора. Текущий сеанс Windows PowerShell не работает от имени администратора. Запустите Windows PowerShell с помощью параметра "Запуск от имени администратора" и попробуйте снова запустить сценарий.
+ CategoryInfo : PermissionDenied: (StackOverflow.ps1:String) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : ScriptRequiresElevation
Код, отправленный Джонатаном и Шей Леви, не работал у меня.
Пожалуйста, найдите рабочий код ниже:
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
#"No Administrative rights, it will display a popup window asking user for Admin rights"
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process "$psHome\powershell.exe" -Verb runAs -ArgumentList $arguments
break
}
#"After user clicked Yes on the popup, your file will be reopened with Admin rights"
#"Put your code here"
Вам нужно перезапустить script с правами администратора и проверить, был ли запущен script в этом режиме. Ниже я написал script, который имеет две функции: DoElevatedOperations и DoStandardOperations. Вы должны поместить свой код, который требует прав администратора, в первый и стандартные операции во второй. Переменная IsRunAsAdmin используется для идентификации режима администрирования.
Мой код - это упрощенная выдержка из Microsoft script, которая автоматически создается при создании пакета приложения для приложений Windows Store.
param(
[switch]$IsRunAsAdmin = $false
)
# Get our script path
$ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path
#
# Launches an elevated process running the current script to perform tasks
# that require administrative privileges. This function waits until the
# elevated process terminates.
#
function LaunchElevated
{
# Set up command line arguments to the elevated process
$RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '" -IsRunAsAdmin'
# Launch the process and wait for it to finish
try
{
$AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru
}
catch
{
$Error[0] # Dump details about the last error
exit 1
}
# Wait until the elevated process terminates
while (!($AdminProcess.HasExited))
{
Start-Sleep -Seconds 2
}
}
function DoElevatedOperations
{
Write-Host "Do elevated operations"
}
function DoStandardOperations
{
Write-Host "Do standard operations"
LaunchElevated
}
#
# Main script entry point
#
if ($IsRunAsAdmin)
{
DoElevatedOperations
}
else
{
DoStandardOperations
}
Добавляя мои 2 цента. Моя простая версия, основанная на сетевой сессии, которая до сих пор работает в Windows 7/Windows 10. Почему это усложняет?
if (!(net session)) {$path = "& '" + $myinvocation.mycommand.definition + "'" ; Start-Process powershell -Verb runAs -ArgumentList $path ; exit}
просто добавьте в начало сценария, и он будет работать от имени администратора.
Вы также можете принудительно открыть приложение как администратор, если, конечно, у вас есть учетная запись администратора.
Найдите файл, щелкните правой кнопкой мыши> свойства> Ярлык> Дополнительно и выберите Запуск от имени администратора
.Затем нажмите ОК.
C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
находится где ярлык PowerShell. Он также по-прежнему переходит в другое место, чтобы вызвать фактическое "exe" (%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
).
Так как PowerShell - это профиль пользователя, управляемый при разрешении; если ваше имя пользователя/профиль имеет права на выполнение чего-то, то в этом профиле, в PowerShell вы, как правило, тоже сможете это сделать. При этом было бы разумным, что вы изменили бы ярлык, расположенный под вашим профилем пользователя, например, C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
.
Щелкните правой кнопкой мыши и щелкните свойства. Нажмите кнопку "Дополнительно" на вкладке "Ярлык", расположенной прямо под текстовым полем "Комментарии", рядом справа от двух других кнопок "Открыть расположение файла" и "Изменить значок" соответственно.
Установите флажок, который читается, "Запуск от имени администратора". Нажмите OK, затем Apply и OK. Еще раз щелкните правой кнопкой мыши значок "Windows PowerShell", расположенный в C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
, и выберите "Pin to Start Menu/Taskbar".
Теперь, когда вы нажимаете этот значок, он будет ссылаться на UAC для эскалации. Выбрав "YES", вы увидите, что консоль PowerShell открыта, и она будет помечена как "Администратор" в верхней части экрана.
Чтобы перейти еще дальше... вы можете щелкнуть правой кнопкой мыши тот же значок ярлыка в вашем расположении профиля Windows PowerShell и назначить комбинацию клавиш, которая будет делать то же самое, что и при нажатии на недавно добавленный значок. Поэтому, когда он говорит "Shortcut Key", введите комбинацию клавиш/кнопок, например: Ctrl + Alt + P P (для PowerShell). Нажмите Apply и OK.
Теперь все, что вам нужно сделать, это нажать эту комбинацию кнопок, которую вы назначили, и вы увидите, что вызывается UAC, и после выбора "YES" вы увидите консоль PowerShell и в строке заголовка отобразится "Администратор".
Это поведение по дизайну. Существует несколько уровней безопасности, поскольку Microsoft действительно не хотела, чтобы файлы .ps1 были последним вирусом электронной почты. Некоторые люди считают, что это противоречит самому понятию автоматизации задач, что справедливо. Модель безопасности Vista + предназначена для "деавтоматизации" вещей, благодаря чему пользователь может их одобрить.
Тем не менее, я подозреваю, что если вы запускаете powershell как повышенный, он должен иметь возможность запускать командные файлы без повторного запроса пароля, пока вы не закроете powershell.
Проблема с ответами @pgk и @Andrew Odri заключается в том, что у вас есть параметры script, особенно когда они являются обязательными. Вы можете решить эту проблему, используя следующий подход:
Вот как бы выглядел код, если script имел обязательные параметры ComputerName и Port:
[CmdletBinding(DefaultParametersetName='RunWithPowerShellContextMenu')]
param (
[parameter(ParameterSetName='CallFromCommandLine')]
[switch] $CallFromCommandLine,
[parameter(Mandatory=$false, ParameterSetName='RunWithPowerShellContextMenu')]
[parameter(Mandatory=$true, ParameterSetName='CallFromCommandLine')]
[string] $ComputerName,
[parameter(Mandatory=$false, ParameterSetName='RunWithPowerShellContextMenu')]
[parameter(Mandatory=$true, ParameterSetName='CallFromCommandLine')]
[UInt16] $Port
)
function Assert-AdministrativePrivileges([bool] $CalledFromRunWithPowerShellMenu)
{
$isAdministrator = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if ($isAdministrator)
{
if (!$CalledFromRunWithPowerShellMenu -and !$CallFromCommandLine)
{
# Must call itself asking for obligatory parameters
& "$PSCommandPath" @script:PSBoundParameters -CallFromCommandLine
Exit
}
}
else
{
if (!$CalledFromRunWithPowerShellMenu -and !$CallFromCommandLine)
{
$serializedParams = [Management.Automation.PSSerializer]::Serialize($script:PSBoundParameters)
$scriptStr = @"
`$serializedParams = '$($serializedParams -replace "'", "''")'
`$params = [Management.Automation.PSSerializer]::Deserialize(`$serializedParams)
& "$PSCommandPath" @params -CallFromCommandLine
"@
$scriptBytes = [System.Text.Encoding]::Unicode.GetBytes($scriptStr)
$encodedCommand = [Convert]::ToBase64String($scriptBytes)
# If this script is called from another one, the execution flow must wait for this script to finish.
Start-Process -FilePath 'powershell' -ArgumentList "-ExecutionPolicy Bypass -NoProfile -EncodedCommand $encodedCommand" -Verb 'RunAs' -Wait
}
else
{
# When you use the "Run with PowerShell" feature, the Windows PowerShell console window appears only briefly.
# The NoExit option makes the window stay visible, so the user can see the script result.
Start-Process -FilePath 'powershell' -ArgumentList "-ExecutionPolicy Bypass -NoProfile -NoExit -File ""$PSCommandPath""" -Verb 'RunAs'
}
Exit
}
}
function Get-UserParameters()
{
[string] $script:ComputerName = [Microsoft.VisualBasic.Interaction]::InputBox('Enter a computer name:', 'Testing Network Connection')
if ($script:ComputerName -eq '')
{
throw 'The computer name is required.'
}
[string] $inputPort = [Microsoft.VisualBasic.Interaction]::InputBox('Enter a TCP port:', 'Testing Network Connection')
if ($inputPort -ne '')
{
if (-not [UInt16]::TryParse($inputPort, [ref]$script:Port))
{
throw "The value '$inputPort' is invalid for a port number."
}
}
else
{
throw 'The TCP port is required.'
}
}
# $MyInvocation.Line is empty in the second script execution, when a new powershell session
# is started for this script via Start-Process with the -File option.
$calledFromRunWithPowerShellMenu = $MyInvocation.Line -eq '' -or $MyInvocation.Line.StartsWith('if((Get-ExecutionPolicy')
Assert-AdministrativePrivileges $calledFromRunWithPowerShellMenu
# Necessary for InputBox
[System.Reflection.Assembly]::Load('Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a') | Out-Null
if ($calledFromRunWithPowerShellMenu)
{
Get-UserParameters
}
# ... script code
Test-NetConnection -ComputerName $ComputerName -Port $Port
Несколько ответов здесь близки, но немного больше работы, чем нужно.
Создайте ярлык для вашего script и настройте его на "Запуск от имени администратора":
Properties...
Target
от <script-path>
до powershell <script-path>
Run as administrator
Вот самоподъемный фрагмент скриптов Powershell, который сохраняет рабочий каталог:
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command '"cd '$pwd'; & '$PSCommandPath';'"";
exit;
}
# Your script here
Сохранение рабочего каталога важно для сценариев, которые выполняют операции, связанные с путем. Почти все остальные ответы не сохраняют этот путь, что может привести к непредвиденным ошибкам в остальной части сценария.
Если вы не хотите использовать самоподъемный сценарий/фрагмент и вместо этого просто хотите легко запустить сценарий в качестве администратора (например, из контекстного меню Проводника), см. Мой другой ответ здесь: fooobar.com/questions/13807190/...
Другим более простым решением является то, что вы также можете щелкнуть правой кнопкой мыши по "C:\Windows\System32\cmd.exe" и выбрать "Запуск от имени администратора", тогда вы можете запускать любое приложение как администратор без предоставления пароля.
Я нашел способ сделать это...
Создайте пакетный файл, чтобы открыть script:
@echo off
START "" "C:\Scripts\ScriptName.ps1"
Затем создайте ярлык на рабочем столе (щелкните правой кнопкой мыши New → Shortcut).
Затем вставьте это в место:
C:\Windows\System32\runas.exe /savecred /user:*DOMAIN*\*ADMIN USERNAME* C:\Scripts\BatchFileName.bat
При первом открытии вам нужно будет ввести пароль один раз. Затем он сохранит его в диспетчере учетных данных Windows.
После этого вы должны иметь возможность запускаться как администратор без необходимости вводить имя пользователя или пароль администратора.
Я использую решение ниже. Он обрабатывает stdout/stderr с помощью функции транскрипции и правильно передает код завершения родительскому процессу. Вам нужно настроить путь/имя файла.
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
echo "* Respawning PowerShell child process with elevated privileges"
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "powershell"
$pinfo.Arguments = "& '" + $myinvocation.mycommand.definition + "'"
$pinfo.Verb = "RunAs"
$pinfo.RedirectStandardError = $false
$pinfo.RedirectStandardOutput = $false
$pinfo.UseShellExecute = $true
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
echo "* Child process finished"
type "C:/jenkins/transcript.txt"
Remove-Item "C:/jenkins/transcript.txt"
Exit $p.ExitCode
} Else {
echo "Child process starting with admin privileges"
Start-Transcript -Path "C:/jenkins/transcript.txt"
}
# Rest of your script goes here, it will be executed with elevated privileges
В ответ на ответ Шей Леви, следуйте приведенной ниже настройке (только один раз)
PATH
папок, например. Windows\System32После настройки:
powershell Start-Process powershell -Verb runAs <ps1_file>
Теперь вы можете запускать все в одной командной строке. Вышеописанное работает на Windows 8 8-разрядный 64-разрядный.
Самый надежный способ, который я нашел, - обернуть его в самоподнимающий файл .bat:
@echo off
NET SESSION 1>NUL 2>NUL
IF %ERRORLEVEL% EQU 0 GOTO ADMINTASKS
CD %~dp0
MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 0); close();"
EXIT
:ADMINTASKS
powershell -file "c:\users\joecoder\scripts\admin_tasks.ps1"
EXIT
. Бат проверяет, если вы уже являетесь администратором и при необходимости перезапускаете script в качестве администратора. Он также предотвращает открытие внешних окон "cmd" с 4-м параметром ShellExecute()
, установленным на 0
.
Ниже описано, как выполнить команду повышенного уровня powershell и собрать ее выходную форму в пакетном файле Windows в одной команде (т.е. не писать сценарий powershell ps1).
powershell -Command 'Start-Process powershell -ArgumentList "-Command (Get-Process postgres | Select-Object Path | Select-Object -Index 0).Path | Out-File -encoding ASCII $env:TEMP\camp-postgres.tmp" -Verb RunAs'
Вы видите, что я сначала запускаю PowerShell с повышенными привилегиями, а затем запрашиваю, чтобы запустить еще один PowerShell (субоболочка) для запуска команды.
Я не видел свой собственный способ сделать это раньше, так что попробуйте это. Легче следить и намного меньше:
if([bool]([Security.Principal.WindowsIdentity]::GetCurrent()).Groups -notcontains "S-1-5-32-544") {
Start Powershell -ArgumentList "& '$MyInvocation.MyCommand.Path'" -Verb runas
}
Очень просто, если текущий сеанс Powershell был вызван с правами администратора, хорошо известный SID группы администратора будет отображаться в группах, когда вы захватите текущую идентификационную информацию. Даже если учетная запись является членом этой группы, SID не будет отображаться, если процесс не был вызван с повышенными учетными данными.
Почти все эти ответы являются разновидностью Microsoft Ben Armstrong, чрезвычайно популярным методом, как выполнить ее, хотя и не понимают, что она на самом деле делает, и как еще эмулировать ту же процедуру.
Чтобы добавить вывод команды в текстовое имя файла, которое включает текущую дату, вы можете сделать что-то вроде этого:
$winupdfile = 'Windows-Update-' + $(get-date -f MM-dd-yyyy) + '.txt'
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -Command `"Get-WUInstall -AcceptAll | Out-File $env:USERPROFILE\$winupdfile -Append`"" -Verb RunAs; exit } else { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -Command `"Get-WUInstall -AcceptAll | Out-File $env:USERPROFILE\$winupdfile -Append`""; exit }
Это пояснение...
Учетная запись полномочий "RUNAS/SAVECRED" "небезопасна", попробовала ее и добавила идентификатор администратора и пароль в кеш учетных данных и может быть использована в другом месте OOPS!. Если вы это сделали, я предлагаю вам проверить и удалить запись.
Просмотрите свою программу или код, потому что политика Microsoft заключается в том, что вы не можете иметь смешанный код пользователя и администратора в том же блочном блоке без UAC (точка входа) для выполнения программы как администратора. Это будет sudo (то же самое) в Linux.
UAC имеет 3 типа, dont'see, подсказку или точку входа, сгенерированную в манифесте программы. Он не поднимает программу, поэтому, если нет UAC, и ему нужен админ, он не сработает. UAC, хотя как требование администратора, хорош, он предотвращает выполнение кода без аутентификации и предотвращает выполнение сценария смешанных кодов на уровне пользователя.
Оказывается, это было слишком легко. Все, что вам нужно сделать, это запустить cmd как администратор. Затем введите explorer.exe
и нажмите enter. Это открывает Windows Explorer.
Теперь щелкните правой кнопкой мыши на PowerShell script, который вы хотите запустить, выберите "запустить с помощью PowerShell", который запустит его в PowerShell в режиме администратора.
Он может попросить вас включить политику для запуска, введите Y и нажмите enter. Теперь script будет запускаться в PowerShell в качестве администратора. В случае, если он работает полностью красным, это означает, что ваша политика еще не повлияла. Затем повторите попытку, и он должен работать нормально.