Powershell脚本Set-MpPreference无法正常工作

nom7f22z  于 11个月前  发布在  Shell
关注(0)|答案(2)|浏览(269)

我已经写了一个shell脚本,将排除在Microsoft Defender防病毒扫描文件夹。我没有太多的经验与shell脚本,这是我想出:

Set-MpPreference -ExclusionPath D:\vpostest
echo "Exclusion Success"
Read-Host -Prompt "Press Enter to exit"

字符串
代码的第一行是我提到排除的地方,下面只是某种提示,通知用户排除成功(它仍然是一个正在进行的工作)。
当我运行脚本时,我收到一个错误:

Set-MpPreference : Operation failed with the following error: 0x%1!x!
At C:\Users\zainur.ariffin\Desktop\Powershell test\autoExclusion.ps1:1 char:1
+ Set-MpPreference -ExclusionPath D:\vpostest
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (MSFT_MpPreference:root\Microsoft\...FT_MpPreference) [Set-MpPreference], CimException
    + FullyQualifiedErrorId : HRESULT 0xc0000142,Set-MpPreference


如果我没有弄错的话,我已经看到以下错误表明Microsoft Defender Antivirus未启用。我已经启用了此功能并重新启动了计算机,甚至使用“Get-MpComputerStatus”进行检查。然而,同样的错误不断出现。为什么会发生这种情况?

h43kikqp

h43kikqp1#

这是给所有和我有同样问题的人的

所以我发现脚本文件不能正常运行的原因是因为我没有以管理员的身份运行powershell。但是如何以管理员的身份运行shell脚本文件呢?
我尝试从脚本文件创建一个快捷方式,并尝试从属性中启用“以管理员身份运行”,但该选项是灰色的。这意味着我不能选择该选项,所以我必须找到另一种方法。
所以我得出一个结论,我需要创建一个脚本文件,将管理员权限授予我想要的脚本。这是因为它是不可能授予管理员权限的脚本本身内的脚本。以下是我用来授予管理员权限的命令:

Start-Process powershell -Verb runAs -ArgumentList $scriptFile

字符串
该“$scriptFile“需要的脚本文件,你打算使用。我希望这是有用的人谁有同样的问题,我。

hts6caw3

hts6caw32#

You found the solution

  • ConfigDefender模块中的Set-MpPreference**小程序必须 * 以提升 *(作为管理员)**运行,因为此模块中 * 修改 * 设置的所有小程序都必须运行。
  • 不幸的是,这些小工具报告的错误消息是如此模糊(从模块的v1.0开始);如果明确说明需要提升,解决方案将是显而易见的。
  • 有关该模块的反馈可以提供给Microsoft via the Feedback Hub app

确保脚本运行时提升的方法:

*Ad hoc,假设脚本文件路径存储在$scriptFile中:

Start-Process -Verb RunAs powershell "-NoExit -File `"$scriptFile`""

字符串

  • -NoExit在脚本退出后保持提升的会话打开,以便您可以检查其输出。
  • 使用-FileCLI参数更适合调用脚本文件,并且嵌入的双引号(``"...")可确保正确处理带有空格的路径。
  • 请注意,提升的会话的工作目录(位置)将为C:\Windows\System32(如果您使用pwsh,PowerShell(Core)CLI,则调用者的工作目录将被保留);如果这是一个问题,请修改脚本以更改位置,或者在调用脚本之前使用-Command-c)CLI调用更改位置-请参阅this answer
    ***使用 self-elevation,即修改脚本,使其在需要时通过elevation重新调用自身,方法是在脚本的开头放置以下内容:
if (-not (net session 2>$null)) { # Test if the session is elevated.
  Write-Warning "Re-invoking with elevation, of necessity in a new window..."
  exit (
    Start-Process -Wait -PassThru -Verb RunAs (Get-Process -Id $PID).Path "-NoExit -File `"$PSCommandPath`""
  ).ExitCode
}

# ... rest of your script, which now runs with elevation
# If powershell.exe was called, the working dir will be C:\Windows\System32.
# pwsh.exe preserves the caller's working dir.

  • 注意:这里假设你的脚本不需要支持 parameters;如果需要,那么一个 robust 的解决方案需要更多的努力:参见this answer
  • 自动变量$PSCommandPath包含运行脚本的完整路径。
  • (Get-Process -Id $PID).Path用于代替硬编码powershell,以确保您使用的是用于启动脚本的相同PowerShell可执行文件;也就是说,如果您从 Windows PowerShell 启动,它将使用powershell.exe,如果您从PowerShell (Core) 7+启动,它将使用pwsh.exe
    *交互创建快捷方式文件(*.lnk
  • 由于*.ps1文件不能从PowerShell外部直接执行,因此单独使用这样一个文件的路径作为快捷方式目标是行不通的:它将被视为一个要打开编辑的文档。
  • 这也是在Advanced...Advanced Properties)子对话框中禁用Run as administrator复选框的原因。
  • 因此,您必须通过PowerShell的CLI显式地调用脚本 *;指定以下目标 * 并结合 * 检查Run as administrator
powershell.exe -NoExit -File "C:\path\to\your\script.ps1"

  • 请注意,通过WScript.Shell COM object以 * 编程方式 * 创建快捷方式文件不幸地 * 不是 * 一个选项,因为它不公开属性以请求以管理员身份运行。

相关问题