Windows和PowerShell具有内置的安全功能和默认配置,旨在防止最终用户在日常活动中意外启动脚本。但是,如果您的日常活动经常涉及编写和运行自己的PowerShell脚本,那么这可能是一个麻烦,而不是一个好处。在这里,我们将向您展示如何在不完全损害安全性的情况下解决这些特性。
PowerShell实际上是一种命令shell和脚本语言,旨在取代Windows系统上的CMD和批处理脚本。因此,PowerShell脚本几乎可以配置为执行任何可以从命令行手动执行的操作。这相当于使您的系统上几乎任何可能的更改,直到您的用户帐户上的限制。因此,如果您只需双击一个PowerShell脚本并以完全的管理员权限运行它,像这样简单的一行代码可能会毁了您的一天:
Get-ChildItem "$env:SystemDrive\" -Recurse -ErrorAction SilentlyContinue | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue不要运行以上命令!
它只需遍历文件系统并尽可能删除任何内容。有趣的是,这可能不会像您想象的那么快地导致系统无法运行—即使是从提升的会话运行时也是如此。但是,如果有人在运行这个脚本后,因为突然找不到文件或运行某些程序而给你打电话,“关闭并再次打开”可能只会导致他们进入Windows启动修复,他们会被告知无法解决问题。更糟糕的是,你的朋友可能会被骗去运行一个下载并安装键盘记录器或远程访问服务的脚本,而不是得到一个只会破坏文件系统的脚本。然后,他们可能会问警察一些关于银行欺诈的问题,而不是问你关于创业修复的问题!
到目前为止,可以这么说,为什么需要某些东西来保护最终用户不受其影响,这一点应该是显而易见的。但高级用户、系统管理员和其他极客通常(尽管也有例外)对这些威胁更为谨慎,知道如何发现并轻松避免这些威胁,只想继续完成工作。要做到这一点,他们必须禁用或绕过几个路障:
在如何使用批处理文件使PowerShell脚本更易于运行中,也会提出同样的问题,我们将指导您编写批处理文件以暂时绕过它们。现在,我们将向您展示如何使用更长期的解决方案来设置系统。请记住,一般情况下,您不应在非您独家使用的系统上进行这些更改,否则,您将使其他用户面临更高的风险,可能会遇到这些功能旨在防止的问题。
首先,也可能是最重要的,让人烦恼的是.PS1文件的默认关联。将这些文件与PowerShell.exe对于防止意外执行不需要的脚本是有意义的。但是,考虑到PowerShell附带了一个专门为编辑PowerShell脚本而设计的集成脚本环境(ISE),我们为什么要在默认情况下在记事本中打开.PS1文件呢?即使您还没有准备好完全切换到启用双击运行功能,您也可能需要调整这些设置。
您可以使用“默认程序”控制面板将.PS1文件关联更改为所需的任何程序,但直接挖掘注册表将使您能够更精确地控制文件的打开方式。这还允许您设置或更改.PS1文件上下文菜单中提供的其他选项。在你做这件事之前别忘了备份注册表!
控制如何打开PowerShell脚本的注册表设置存储在以下位置:
HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell要在更改这些设置之前浏览这些设置,请使用Regedit查看该键及其子键。Shell键应该只有一个值,“(Default)”,设置为“Open”。这是指向双击文件的默认操作的指针,我们将在子键中看到。
展开Shell键,您将看到三个子键。其中每一个都表示您可以执行的特定于PowerShell脚本的操作。
您可以展开每个键来探索其中的值,但它们基本上等同于以下默认值:
如果您想继续使用已经可用的预构建命令字符串,只需更改Shell键中的“(Default)”值,以匹配与双击所需操作相匹配的键的名称。这可以很容易地在Regedit中完成,或者您也可以使用我们的教程中关于使用PowerShell探索注册表的经验(加上一个小的PSDrive调整)来开始构建一个可重用的脚本,该脚本可以为您配置系统。以下命令必须从提升的PowerShell会话运行,类似于以管理员身份运行CMD。
首先,您需要为HKEY\u CLASSES\u ROOT配置PSDrive,因为这不是默认设置。命令如下:
New-PSDrive HKCR Registry HKEY_CLASSES_ROOT现在您可以在HKEY\ U CLASSES\ U ROOT中导航和编辑注册表项和值,就像在常规HKCU和HKLM PSDrives中一样。
要配置双击以直接启动PowerShell脚本,请执行以下操作:
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 0要配置双击以在PowerShell ISE中打开PowerShell脚本,请执行以下操作:
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Edit'要还原默认值(设置双击以在记事本中打开PowerShell脚本):
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Open'这只是更改默认双击操作的基础。在下一节中,我们将详细介绍如何自定义在PowerShell中从资源管理器打开PowerShell脚本时如何处理它们。请记住,作用域可以防止PSDrives在会话间持久化。因此,您可能希望在为此目的构建的任何配置脚本的开头包含新的PSDrive行,或者将其添加到PowerShell概要文件中。否则,在尝试以这种方式进行更改之前,需要手动运行该位。
PowerShell的ExecutionPolicy是防止恶意脚本执行的另一层保护。这有多种选择,还有几种不同的设置方法。从最安全到最不安全,可用的选项包括:
根据Undefined的描述,可以在多个范围中的一个或多个范围中设置上述策略。可以使用Get ExecutionPolicy和-List参数来查看所有作用域及其当前配置。
作用域按优先顺序列出,最上面定义的作用域优先于所有其他作用域。如果未定义任何策略,系统将返回其默认设置(在大多数情况下,这是受限的)。
由于本文主要讨论的是绕过安全性以提高可用性,所以我们只关心下面三个范围。MachinePolicy和UserPolicy设置只有在您想要强制执行一个不那么简单地绕过的限制性策略时才真正有用。通过将我们的更改保持在流程级别或以下,我们可以随时轻松地使用我们认为适合特定情况的任何策略设置。
为了在安全性和可用性之间保持某种平衡,屏幕截图中显示的策略可能是最好的。将LocalMachine策略设置为Restricted通常会阻止除您之外的任何人运行脚本。当然,知道自己在做什么的用户可以不费吹灰之力地绕过这个问题。但它应该可以防止任何不懂技术的用户意外触发PowerShell中的灾难**件。将CurrentUser(即:you)设置为Unrestricted允许您从命令行手动执行脚本,但会保留对从Internet下载的脚本的警告提示。进程级别的RemoteSigned设置需要以快捷方式完成PowerShell.exe或者(我们将在下面做)在注册表值中控制PowerShell脚本的行为。这将使您可以轻松地双击运行您编写的任何脚本的功能,同时对来自外部源的(潜在的恶意)脚本的无意执行设置了更强大的屏障。我们希望在这里这样做,因为无意中双击脚本要比从交互式会话手动调用脚本容易得多。
要按照上面的屏幕截图设置CurrentUser和LocalMachine策略,请从提升的PowerShell会话运行以下命令:
Set-ExecutionPolicy Restricted Set-ExecutionPolicy Unrestricted -Scope CurrentUser要在从资源管理器运行的脚本上实施RemoteSigned策略,我们必须更改前面查看的其中一个注册表项中的值。这一点尤其重要,因为根据您的PowerShell或Windows版本,默认配置可能是绕过除AllSigned之外的所有ExecutionPolicy设置。要查看计算机的当前配置,可以运行此命令(确保先映射HKCR PSDrive):
Get-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell\Command | Select-Object '(Default)'您的默认配置可能是以下两个字符串中的一个,或者相当类似的字符串:
(在Windows 7 SP1 x64上看到,带有PowerShell 2.0)
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-file" "%1"(在Windows 8.1 x64和PowerShell 4.0上看到)
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"第一个还不错,因为它所做的只是在现有的ExecutionPolicy设置下执行脚本。通过对更容易发生事故的操作实施更严格的限制,可以使它变得更好,但这并不是最初打算在双击时触发的,而且默认策略终究是受到限制的。然而,第二种选择是完全绕开你可能有的任何执行策略——甚至是限制性的。由于绕过将应用于流程范围,因此它仅影响从资源管理器运行脚本时启动的会话。但是,这意味着您可能会启动一些脚本,否则您可能会期望(并希望)您的策略禁止这些脚本。
要为从Explorer启动的脚本设置进程级ExecutionPolicy,根据上面的屏幕截图,您需要修改我们刚才查询的相同注册表值。您可以在Regedit中手动执行此操作,方法是将其更改为:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-ExecutionPolicy" "RemoteSigned" "-file" "%1"如果愿意,您还可以在PowerShell中更改设置。请记住从提升会话执行此操作,并映射HKCR PSDrive。
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell\Command '(Default)' '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-ExecutionPolicy" "RemoteSigned" "-file" "%1"'正如完全禁用UAC是一个坏主意一样,除非您确实需要它们执行需要管理员访问的操作,否则使用提升的权限运行脚本或程序也是一种糟糕的安全实践。因此,不建议将UAC提示符构建到PowerShell脚本的默认操作中。但是,我们可以添加一个新的上下文菜单选项,以便在需要时在提升的会话中轻松运行脚本。这类似于将“用记事本打开”添加到所有文件的上下文菜单的方法,但这里我们只针对PowerShell脚本。我们还将继续上一篇文章中使用的一些技术,其中我们使用批处理文件而不是注册表黑客来启动PowerShell脚本。
要在Regedit中执行此操作,请返回Shell键:
HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell在那里,创建一个新的子键。称之为“与PowerShell(Admin)一起运行”。在其下面,创建另一个名为“Command”的子键。然后,将命令下的“(Default)”值设置为:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" ""& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -File \"%1\"' -Verb RunAs}"在PowerShell中执行同样的操作实际上这次需要三行代码。一个用于每个新键,另一个用于设置命令的“(默认)”值。别忘了仰角和HKCR地图。
New-Item 'HKCR:\Microsoft.PowerShellScript.1\Shell\Run with PowerShell (Admin)' New-Item 'HKCR:\Microsoft.PowerShellScript.1\Shell\Run with PowerShell (Admin)\Command' Set-ItemProperty 'HKCR:\Microsoft.PowerShellScript.1\Shell\Run with PowerShell (Admin)\Command' '(Default)' '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" ""& {Start-Process PowerShell.exe -ArgumentList ''-ExecutionPolicy RemoteSigned -File \"%1\"'' -Verb RunAs}"'另外,请注意通过PowerShell输入的字符串与进入注册表的实际值之间的差异。特别是,为了避免命令解析中的错误,我们必须将整个过程用单引号括起来,并在内部单引号上加上两个引号。
现在您应该有一个新的PowerShell脚本上下文菜单条目,名为“runwithpowershell(Admin)”。
新选项将生成两个连续的PowerShell实例。第一个只是第二个的启动程序,它使用带有“-Verb RunAs”参数的启动进程来请求新会话的提升。在那里,您的脚本应该能够在通过UAC提示符单击后以管理员权限运行。
这里还有一些小改动,可以让生活更轻松一些。首先,把记事本功能完全去掉怎么样?只需将“(Default)”值从Edit(下面)下的命令键复制到Open下的相同位置。
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe" "%1"或者,您可以使用这个PowerShell(当然还有Admin&HKCR):
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell\Open\Command '(Default)' '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe" "%1"'另一个小麻烦是,一旦脚本完成,控制台就会消失。当这种情况发生时,我们没有机会查看脚本输出中的错误或其他有用信息。当然,这可以通过在每个脚本的末尾暂停来解决。或者,我们可以修改命令键的“(Default)”值以包含“-NoExit”参数。以下是修改后的值。
(无管理员权限)
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-NoExit" "-ExecutionPolicy" "RemoteSigned" "-file" "%1"(具有管理员权限)
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" ""& {Start-Process PowerShell.exe -ArgumentList '-NoExit -ExecutionPolicy RemoteSigned -File \"%1\"' -Verb RunAs}"当然,我们也会在PowerShell中为您提供这些命令。最后提醒:仰视及香港华润!
(非管理员)
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell\Command '(Default)' '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-NoExit" "-ExecutionPolicy" "RemoteSigned" "-file" "%1"'(管理员)
Set-ItemProperty 'HKCR:\Microsoft.PowerShellScript.1\Shell\Run with PowerShell (Admin)\Command' '(Default)' '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" ""& {Start-Process PowerShell.exe -ArgumentList ''-NoExit -ExecutionPolicy RemoteSigned -File \"%1\"'' -Verb RunAs}"'为了测试这一点,我们将使用一个脚本,它可以显示ExecutionPolicy设置,以及脚本是否以管理员权限启动。脚本将被调用“MyScript.ps1,并存储在我们的示例系统上的“D:\Script Lab”中。代码如下,供参考。
if(([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {Write-Output 'Running as Administrator!'} else {Write-Output 'Running Limited!'} Get-ExecutionPolicy -List使用“使用PowerShell运行”操作:
单击UAC后,使用“Run with PowerShell(Admin)”操作:
为了演示进程作用域中的ExecutionPolicy,我们可以使用以下PowerShell代码使Windows认为文件来自Internet:
Add-Content -Path 'D:\Script Lab\MyScript.ps1' -Value "[ZoneTransfer]`nZoneId=3" -Stream 'Zone.Identifier'幸运的是,我们启用了-NoExit。否则,这个错误就会被忽略,我们就不会知道了!
这个区域标识符可通过以下方式删除:
Clear-Content -Path 'D:\Script Lab\MyScript.ps1' -Stream 'Zone.Identifier'有用的参考资料:
文件加密和解密可以是一个工作位。但是,使用PowerShell扩展,可以将进程精简为一行命令。为此,我们需要安装Gpg4win和Powershell模块。使用脚本,我们可以自动化文件加密和解密过程。 ...
大多数用户从未听说过PowerShell,更不用说触摸它并试用了。这可能是因为这个名字,听起来像是只有铁杆IT极客才会使用的东西。或者是因为PowerShell的好处还不清楚。可能是因为最初的学习曲线。 ...
Windows PowerShell是一个优秀的配置管理和自动化框架。它由命令行shell和基于.NET的脚本语言组成。管理员使用PowerShell作为管理Windows、Linux和网络客户端的一种手段。 ...
...去除。也有一些不同的删除选项:使用传统的卸载、使用PowerShell命令和第三方安装程序。 ...
... 不过,多亏了Windows PowerShell,您可能不再需要腻子了。让我们看看如何在windows10中设置SSH访问,以及新工具是否可以取代PuTTY。 ...
...想要的。 要安装它们,请打开Windows终端、命令提示符或PowerShell窗口。例如,您可以右键单击开始按钮或按Windows+X并选择“Windows PowerShell”以打开PowerShell窗口。您不必以管理员身份启动它。 将该命令从网页复制粘贴到命令行...
...将使用以下命令: ren "Home Movie.ogv" "First Birthday.ogv" 使用powershell重命名文件和文件夹 在命令行环境中重命名文件和文件夹时,Windows PowerShell甚至比命令提示符更强大、更灵活。虽然我们只讨论命名文件的表面,但您可以做一些...
微软于2020年3月4日宣布PowerShell 7.0。这是PowerShell、Microsoft跨平台命令行shell和脚本语言的最新主要更新。下面是什么新的,以及如何在Windows PC上安装它。 powershell 7有什么新功能? 最新版本PowerShell 7是在以前的PowerShell Core 6.1基...