十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PowerShell管理员权限全指南:UAC原理、打开方式与脚本提权修复

PowerShell管理员权限全指南:UAC原理、打开方式与脚本提权修复 在Windows上用过PowerShell的人多半都经历过这种诡异瞬间同一行命令在普通窗口里敲会报“拒绝访问”换到标题栏带“管理员”字样的窗口就能跑通但问题是大多数人根本不知道那个带“管理员”字样的窗口到底该怎么正常打开。这篇文章就是把这件事彻底讲透为什么PowerShell非要分普通和管理员两种身份哪些操作必须提权以及从最简单的右键菜单到注册表修复、再到开机自启提权脚本完整的打开方式和排错思路都会聊到。适合刚接触PowerShell的新手也适合经常在Windows上做运维、装软件、写脚本的同事建议先收藏再慢慢看。1. 为什么PowerShell非要分“普通”和“管理员”两种身份1.1 窗口标题栏那个“管理员”到底代表了什么很多刚从Linux转到Windows的朋友会有个困惑Linux里sudo一下就有了root权限Windows里我本身就是Administrator账户为什么打开PowerShell还是各种“访问被拒绝”这里面的关键机制叫UAC用户账户控制从Windows Vista开始就存在了。UAC的核心逻辑是即使你用的是管理员账户系统默认也只给你发一个“标准令牌”。当你运行某个需要管理员权限的程序或命令时系统会先弹出一个UAC确认框确认通过后才生成一个“完整令牌”这个完整令牌才是真正能改系统设置、操作服务、写注册表的高权限身份。所以你在开始菜单搜到PowerShell回车打开的那个窗口本质上用得还是标准令牌。只有标题栏明确显示“管理员”或者弹出了UAC确认框这个进程才带着完整令牌。这就是为什么有人会遇到“同一个脚本普通窗口运行报错管理员窗口就能过”的现象因为两个进程根本不在同一个权限等级上。1.2 哪些操作必须用管理员身份运行判断是否需要管理员身份有一条相对实用的经验凡是涉及系统全局配置、硬件层、服务层、系统目录的操作基本都跑不掉提权。我把自己日常碰到的情况列一下方便对照修改执行策略Set-ExecutionPolicy如果是改LocalMachine或MachinePolicy作用域就必须管理员。安装或卸载系统服务比如用New-Service、sc.exe create注册Windows服务。操作Windows Update、防火墙规则、共享目录、IIS站点配置。修改HKLM下的注册表项。停止或启动系统级服务像Stop-Service、Restart-Service某些受保护服务。使用DISM、sfc /scannow修复系统镜像。运行涉及%ProgramFiles%、C:\Windows等系统目录的读写脚本。安装一些需要写驱动、写系统服务的软件比如很多安全工具、数据库安装包。除这些场景外像普通文件复制、批量重命名、跑个数据清洗脚本、调接口普通窗口完全够用。所以我个人的习惯是平时尽量用普通窗口工作只有在确定需要系统级操作时才开管理员窗口不仅能减少误操作风险也能避免很多“脚本里一个Remove-Item误删系统路径”的惨剧。2. 最常用的八种打开方式总有一种适合你2.1 开始菜单搜索法最基础点击开始菜单直接输入powershell稍等片刻搜索结果里会出现“Windows PowerShell”。如果只是普通打开直接回车或者点一下就行如果想管理员身份运行重点来了——数一下左侧或右侧有没有“以管理员身份运行”的按钮有就直接点。如果没有可以先选中“Windows PowerShell”然后同时按Ctrl Shift Enter这样也能直接触发提权窗口系统会弹UAC确认框。这个方法在任何Windows 10、Windows 11版本上都通用也是大多数人最常用的入口。唯一需要注意的是Win11的搜索结果默认可能显示的是“Windows PowerShell”还是“PowerShell 7”如果系统里装了PowerShell 7两个都会显示选哪个取决于你要用哪个版本。2.2 Win X快捷键菜单Win X组合键会弹出高级用户菜单在Windows 10里通常能看到“Windows PowerShell管理员”选项点击后同样会弹UAC确认框。Windows 11默认把这个菜单改成了“终端管理员”或“终端”因为Win11的默认终端换成了Windows Terminal。如果你用惯了Win10的布局在Win11上也可以把菜单改回Windows PowerShell右键任务栏空白处选择“任务栏设置”找到“个性化 任务栏”相关选项把“用Windows PowerShell替换命令提示符”这类设置打开不同版本名称略有差异之后Win X菜单里就会直接出现Windows PowerShell和Windows PowerShell管理员两个入口。2.3 Win R运行框法按Win R打开运行窗口输入powershell按下Ctrl Shift Enter这一步非常关键。如果只按回车那就是普通窗口只有同时按Ctrl Shift Enter运行框才会以管理员身份启动程序。这是我平时最常用的方式因为不管当前在什么界面只要能呼出运行框就能快速提权不需要回到桌面找图标。顺带补充一个小技巧运行框里也可以输入powershell -ExecutionPolicy Bypass来启动一个不限制脚本执行的PowerShell进程这在调试不信任脚本时会用到后面讲执行策略时会详细展开。2.4 任务管理器法适合右键菜单坏掉时应急如果开始菜单搜索不好使了或者右键菜单被清理工具搞坏了任务管理器是一个非常可靠的入口。按Ctrl Shift Esc打开任务管理器点击左上角“文件”菜单选择“运行新任务”在弹出的对话框里输入powershell然后务必勾选“以系统管理权限创建此任务”再点确定。这样启动的PowerShell就是管理员身份完全绕过了开始菜单、右键菜单等依赖Shell的入口。这个方法在系统右键菜单异常、资源管理器未响应、甚至桌面上什么都点不了的情况下依然有效属于紧急救援型方案。我自己遇到过一次资源管理器重启后右键菜单全消失的情况就是用任务管理器打开管理员PowerShell后再执行sfc /scannow把系统文件修好的。2.5 文件资源管理器地址栏法在文件资源管理器的地址栏里直接输入powershell然后回车会在当前目录下打开一个PowerShell窗口路径自动切到当前文件夹。这个方式最大的好处是省去cd切换目录的步骤特别适合“我想在某个项目目录里跑脚本”的场景。缺点是地址栏启动的窗口默认是普通权限不会提权。如果既要切到当前目录又要管理员权限可以提前在文件夹空白处按住Shift键并右键看菜单里有没有“在此处打开PowerShell窗口”或“在终端中打开”很遗憾这种方式默认也不是管理员。真正稳妥的做法是先用其他方式打开管理员PowerShell再用Set-Location -Path C:\目标路径手动切目录或者用Push-Location记忆目录。2.6 Windows Terminal里配置默认管理员装了Windows Terminal之后你可以在下拉箭头里选择“设置”然后在左侧的配置文件里找到Windows PowerShell或者PowerShell点击右侧的“以管理员身份运行此配置文件”开关打开后每次新建这个标签页都会自动请求管理员权限。好处是一劳永逸以后在Windows Terminal里开PowerShell标签页默认就是提权状态不用每次再找右键菜单。但我不建议把所有配置文件都设成管理员。我个人只把专门的“管理员PowerShell”配置文件设成了提权普通工作还是开标准窗口因为Windows Terminal里不同标签页共享同一个进程一旦某个标签页提权了通过它启动的其他shell也可能继承更高权限这会让Windows Terminal整个会话都处于高风险状态。2.7 创建快捷方式并忘记密码在桌面或任意位置新建快捷方式对象位置填powershell.exe名称随意。右键这个快捷方式选择“属性” - “高级”勾选“用管理员身份运行”确定保存。之后每次双击这个快捷方式都会弹出UAC确认框确认后就是管理员PowerShell。这种方法适合有固定习惯的人也适合把快捷方式固定到任务栏。一个容易踩的坑是直接从开始菜单把Windows PowerShell拖到桌面再改属性系统可能提示“无法修改这个快捷方式”这时先复制快捷方式到桌面再修改副本属性就正常了。2.8 利用Shift 右键的“以管理员身份运行”如果你已经拿到了一个.ps1脚本文件不需要先打开PowerShell窗口再手动执行可以直接按住Shift键然后右键点击这个脚本文件在展开的菜单里通常会出现“以管理员身份运行”点击后会先弹UAC确认然后以管理员权限执行该脚本。这个方式看起来只差一步但它依赖脚本文件关联和右键菜单注册表项的正常状态很多“右键没有这个选项”的问题就出在这里这也是下一章要重点解决的问题。为了方便对照我把这几种方式的特点整理成了一个表格平时用哪个一眼就能判断打开方式是否支持管理员提权推荐指数适用场景开始菜单搜索法支持CtrlShiftEnter★★★★★日常使用WinX高级用户菜单支持有管理员入口★★★★★Win10/Win11系统自带WinR运行框支持CtrlShiftEnter★★★★★快速应急任务管理器支持勾选“以系统管理权限创建任务”★★★★★右键、开始菜单异常时资源管理器地址栏不支持提权只适合切目录★★★☆☆快速在目录内打开Windows Terminal支持配置文件可设默认提权★★★★☆重度命令行用户桌面快捷方式支持属性里勾选★★★★☆固定入口Shift右键脚本文件支持脚本文件右键菜单★★★☆☆直接运行ps1脚本3. 右键菜单“以管理员身份运行”消失怎么修复3.1 问题成因不只是个案有朋友提问“bat文件右击怎么没有以管理员身份运行了”其实.bat和.ps1文件右键菜单里的“以管理员身份运行”选项是独立注册的它依赖注册表中对应的Shell\RunAs项。这个选项消失的原因常见的有这几类第一文件关联被第三方软件改了比如把.ps1文件的默认打开方式改成了记事本右键菜单自然就不会再显示PowerShell相关的选项。第二某些安全软件或清理工具把右键菜单里的“RunAs”项当成了垃圾注册表项给清理掉了。第三注册表里的PowerShell类别项HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1被改坏或丢失。第四系统开启了某些精简策略把右键扩展菜单给关掉了。3.2 先别急着改注册表检查文件关联修复的第一步不是动注册表而是先把文件关联恢复正确。右键任意.ps1文件选择“打开方式” - “选择其他应用”在列表里找到Windows PowerShell勾选“始终使用此应用打开.ps1文件”。如果列表里没有Windows PowerShell点击“在这台电脑上查找其他应用”定位到C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe。文件关联恢复后再试一次右键菜单有没有出现“使用PowerShell运行”或“以管理员身份运行”。如果还没有再考虑注册表层面的修复。3.3 重建注册表RunAs项的详细步骤这一步需要以管理员身份打开注册表编辑器regedit路径定位到HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell。正常情况下这个路径下应该有open、runas等子项。如果发现runas子项缺失可以手动添加。手动添加有两种办法。第一种打开记事本把下面的内容保存为fix_ps1_runas.reg双击导入Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\RunAs] 以管理员身份运行 [HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\RunAs\Command] powershell.exe -NoExit -File \%1\第二种直接在注册表编辑器里手动创建在Microsoft.PowerShellScript.1\Shell下新建项命名RunAs把默认值的字符串值改成“以管理员身份运行”在RunAs下再新建项Command把默认值改成powershell.exe -NoExit -File %1。注意%1是脚本路径的占位符顺手给PowerShell加了-NoExit这样脚本执行完窗口不会一闪而过方便看输出结果。改完之后关掉注册表编辑器再刷新一下右键脚本文件应该就能看到“以管理员身份运行”了。同理如果你想恢复.bat文件的“以管理员身份运行”选项对应的注册表路径是HKEY_CLASSES_ROOT\batfile\shell\runas内容类似把command改成cmd.exe /c %1即可。3.4 使用系统命令自动修复如果不想手动改注册表也可以先试两板斧。以管理员身份打开PowerShell依次执行sfc /scannow等待系统文件检查完成后再执行DISM /Online /Cleanup-Image /RestoreHealth这两个命令会检查并修复Windows系统文件损坏对于右键菜单因为系统文件错乱消失的情况有奇效。执行完建议重启一次再看右键菜单是否恢复。如果仍然没有恢复再走3.3的注册表方案。3.5 应急替代方案修复前如何先拿到管理员窗口在注册表修复完成之前你仍然需要管理员权限去做修复操作这就形成了一个“先有鸡还是先有蛋”的问题。我的做法是先用任务管理器法见2.4打开管理员窗口因为任务管理器本身不依赖右键菜单能直接勾选“以系统管理权限创建此任务”。或者用Win R运行框输入powershell再按Ctrl Shift Enter这个入口同样不依赖右键菜单。所以哪怕右键菜单彻底没了提权入口并没有消失不用太慌。在管理员窗口里执行regedit或运行修复命令就能完成后续所有操作。4. 管理员权限、执行策略和脚本运行三者必须一起搞懂4.1 执行策略的真正含义很多新手提权之后第一件事就是去改Set-ExecutionPolicy结果系统提示“Windows PowerShell已成功更新你的执行策略但在更具体的作用域中定义的策略...”然后一脸懵。要理解这句话得先知道PowerShell的执行策略不是只存在于一个地方它按从小到大有四个优先级MachinePolicy组策略、UserPolicy用户组策略、Process当前进程、CurrentUser当前用户、LocalMachine本机。Get-ExecutionPolicy -List可以一次性看到当前所有作用域的策略。Set-ExecutionPolicy默认改的是LocalMachine作用域但如果你在某个更具体的作用域比如CurrentUser里设置了更严格的策略PowerShell依然会遵循那个更具体、优先级更高的设置。所以提示“已成功更新但在更具体的策略中...”并不是报错只是提醒你还有一层策略限制着。真正确认最终生效值的方式是执行Get-ExecutionPolicy不带参数它显示的就是当前进程实际使用的策略。常见的安全组合是把LocalMachine设为RemoteSigned表示本地脚本可以运行从互联网下载的脚本需要带数字签名才可以。如果你只是想在自己电脑上跑下载来的安装脚本又不想留下一个全局开放式策略更稳妥的方式是用临时参数绕过而不是永久放宽策略。4.2 临时绕过执行策略的标准姿势比如你想运行一个D:\scripts\install.ps1可以这样powershell.exe -ExecutionPolicy Bypass -File D:\scripts\install.ps1这个写法不改任何作用域的策略只对当前启动的进程生效权限控制更干净。如果不想用-File也可以用-Command配合调用符powershell.exe -ExecutionPolicy Bypass -Command D:\scripts\install.ps1另外一个非常常见的场景是使用PowerShell的一键安装脚本热词里提到的irm https://.../install.ps1 | iex就是这样一种执行方式。分解来看irm是Invoke-RestMethod的别名负责从指定URL下载文本内容iex是Invoke-Expression的别名负责把字符串当作PowerShell命令执行。两段命令通过管道组合在一起就实现了“下载脚本并直接执行”。好处是快捷省事缺点是等于直接把远程传来的内容交给你本机PowerShell执行风险极大。我的建议是遇到这类命令先拆开执行把内容存成文件看一遍再跑Invoke-WebRequest -Uri https://example.com/install.ps1 -OutFile C:\Temp\install.ps1 # 用编辑器打开检查后再决定是否执行 C:\Temp\install.ps1这不代表所有irm | iex命令都是恶意的很多官方工具的安装脚本确实推荐这种形式但“先下载检查后执行”这个习惯永远不会让你吃亏。4.3 开机自启脚本如何以管理员权限运行写一个开机自启的PowerShell脚本常规做法是往启动文件夹里丢一个快捷方式但这样默认不会提权遇到需要管理员权限的操作还是会失败。真正可靠的方式是使用“任务计划程序”。按Win R输入taskschd.msc打开任务计划程序。点击“创建任务”在“常规”选项卡里勾选“使用最高权限运行”触发器设置为“登录时”或“启动时”操作选择“启动程序”程序填powershell.exe添加参数填-ExecutionPolicy Bypass -File C:\Scripts\startup.ps1这样设置的任务在开机后会静默地以最高权限启动PowerShell不会弹出UAC窗口也不需要你手动介入。这里有个值得注意的坑任务计划程序里的“使用最高权限运行”和UAC提权不完全等价如果系统设置了非常严格的用户权限控制任务仍可能受限另外使用SYSTEM账户运行任务时脚本里涉及用户目录、网络映射盘的部分可能会访问不到因为SYSTEM用户的会话环境不一样。如果你的脚本并不需要管理员权限建议不要勾选“使用最高权限运行”让它在普通用户权限下跑能降低很多安全风险。5. 关于PowerShell版本、乱码、脚本兼容性的几个高频问题5.1 Windows PowerShell 5.1和PowerShell 7到底该用哪个现在Windows系统上默认的Windows PowerShell 5.1和可以单独安装的PowerShell 7是两套完全独立的产品共用一个名字但机制不同。Windows PowerShell 5.1是系统组件跟着Windows走版本号以5.1结尾PowerShell 7是跨平台产品基于.NET Core现在叫.NET构建需要去GitHub或通过winget单独安装可以在Windows、macOS、Linux上运行。要判断当前窗口用的是什么版本直接看$PSVersionTable.PSVersion。如果你还在用Windows 7那自带的PowerShell可能是2.0很多新语法和命令都不支持建议装一下WMF 5.1升级到5.1安装前需要先装好.NET Framework 4.5.2以上版本。如果你用的是Windows 10/11其实大部分情况下直接用系统自带的5.1就够了除非你要用、三元运算符、ForEach-Object -Parallel等新语法或者遇到了中文乱码这类5.1老毛病。Win11要修改默认终端为PowerShell 7只需要两步先在Windows Terminal设置里把“默认配置文件”选为“PowerShell”再把系统“设置 - 隐私和安全性 - 开发者选项”里的“终端”改成“Windows终端”。这样以后按下Win X或打开终端默认用的就是PowerShell 7。5.2 中文乱码代码页和编码的双重锅热词里有“deepseek配置windows powershell乱码”其实这本质是编码问题。Windows PowerShell 5.1默认控制台代码页是系统的ANSI代码页中国大陆简体中文系统下一般是GBK代码页936。很多AI命令行工具、脚本输出的是UTF-8编码两者对不上中文自然就变成乱码了。最快的临时解决办法是在PowerShell窗口里执行chcp 65001把控制台代码页切换到UTF-8。如果脚本本身就输出UTF-8但想在5.1里正常读进来还可以在脚本开头设置[Console]::OutputEncoding [System.Text.Encoding]::UTF8 $OutputEncoding [Console]::OutputEncoding不过说实话这些设置每次都要手动跑很烦治本的办法有两个第一把.ps1脚本保存为“带BOM的UTF-8”编码Windows PowerShell 5.1读取时能正确识别第二直接用PowerShell 7它对UTF-8的处理更符合现代习惯默认就是UTF-8无BOM基本没有乱码烦恼。我自己现在处理任何中文脚本都优先用PowerShell 7Windows PowerShell 5.1只用来跑那些依赖系统组件的兼容性脚本。5.3 用不了那是版本限制不是你的问题Windows命令行cmd里可以用把两条命令连起来比如dir cd temp表示前面成功后再执行后面。但Windows PowerShell 5.1不支持这种写法直接输入会报错。PowerShell 7开始才支持和||这两个命令链运算符。如果你还停留在5.1又想实现类似逻辑有两个办法。如果是命令行式的原生命令可以这样写net stop spooler; if ($?) { net start spooler }$?表示上一条命令是否成功true才执行后面的操作。如果是PowerShell的cmdlet也可以直接利用-ErrorAction配合判断Stop-Service spooler -ErrorAction SilentlyContinue if (Get-Service spooler | Where-Object { $_.Status -eq Stopped }) { Start-Service spooler }如果你确定自己需要、||、三元运算符这类现代语法当前的思路是把PowerShell升级到7。5.4 “PowerShell能打包gz文件吗”这个问题我当初也找了好半天严格来说Windows PowerShell 5.1没有内置一个Compress-Gzip这样的成熟cmdletCompress-Archive只能生成zip格式。但这不代表Windows上没有命令行工具能打gzWindows 10 1803以后的系统自带了tar命令可以直接用tar -czvf backup.tar.gz C:\Users\admin\Documents\backup这段命令会把backup目录打包成backup.tar.gz-z参数表示用gzip压缩。这个tar不是GNU tar而是libarchive的bsdtar但日常使用完全够了。如果想在PowerShell脚本里用更贴近.NET的姿势去处理gz也可以用System.IO.Compression.GZipStream但那是给开发者准备的需要写更多代码。最省心的结论打包gz优先用tar不是所有需求都要靠PowerShell cmdlet完成。5.5 老版本SQL Server安装时提示PowerShell失败怎么办热词里有一条“在已经移除PowerShell 2.0的系统中安装sql server”这是个非常典型的老环境兼容问题。SQL Server 2008 R2、SQL Server 2012的安装程序在安装前会检查Windows PowerShell这个前置组件而且它们需要的不是PowerShell 5.1而是2.0。在新版Windows里PowerShell 2.0这个功能可能已经被移除或根本不存在安装程序就会直接报错停下。如果你确实要在这种环境里装旧版SQL Server第一步先看看系统“启用或关闭Windows功能”里有没有“.NET Framework 3.5包括.NET 2.0和3.0”这组功能里有PowerShell 2.0的运行基础勾选启用后重启再试。如果系统完全没有PowerShell 2.0相关组件那么大概率要继续往上升级SQL Server版本而不是和安装程序硬刚。另一个经验是安装SQL Server时务必用管理员身份运行安装程序同时建议提前把PowerShell执行策略调到RemoteSigned因为安装过程里会执行一些PowerShell脚本策略限制太死也会导致安装失败。5.6 关于“win7安装powershell 5.1”的补充Win7自带PowerShell 2.0想升级到5.1需要安装对应版本的WMFWindows Management Framework包具体版本是WMF 5.1对应补丁号KB3191566。安装前先确保系统已安装.NET Framework 4.5.2及以上版本否则WMF 5.1装不上。装上后用$PSVersionTable确认一下版本号看到PSVersion显示5.1.x就说明升级成功。这个过程中也许会引导重启最好在重启后再测试PowerShell是否工作正常免得影响后续操作。6. 一些关于管理员权限的个人经验关于怎么以管理员身份运行PowerShell方法和排错讲完了最后分享几个我日常积累的操作习惯。第一判断当前PowerShell窗口到底有没有管理员权限不要靠猜。直接执行whoami /groups | find S-1-16-12288如果输出里有S-1-16-12288这一行说明当前进程是“高完整性级别”也就是管理员提权状态没有输出就是普通权限。这个命令在Windows 10和Windows 11上都能用比看标题栏靠谱得多。第二写脚本时如果这个脚本必须提权才能跑建议在脚本开头加一段自动提权逻辑避免使用者双击后报一堆看不懂的错误if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Start-Process powershell -Verb RunAs -ArgumentList -NoExit -File $PSCommandPath exit }这段代码先判断当前是不是管理员不是的话就通过Start-Process -Verb RunAs重新以管理员身份启动自身。使用者感受就是双击脚本后弹了一个UAC框点“是”就自动跑起来了。注意这只是“自动请求提权”不是绕过UACUAC弹窗本身还是会出来的。第三平时用普通窗口确需提权再用管理员窗口别图省事全程管理员。普通窗口下跑脚本遇到系统级操作会报错但至少不会因为脚本里一个误写把系统目录里的文件删了。管理员窗口里的误操作基本没有机会反悔。最后再多说一句管理员权限本质上是Windows系统安全边界的一个闸门什么时候提权、用什么方式提权其实比“怎么提权”更重要。把上面这些打开方式、修复步骤和判断命令记熟了以后再遇到“右键没有管理员运行选项”或者“脚本运行不了”的问题基本都能自己定位到是权限问题还是执行策略问题对付这些日常Windows折腾场景应该就够用了。
返回列表