在PowerShell中以管理员身份运行Bat

fumotvh3  于 2023-06-23  发布在  Shell
关注(0)|答案(3)|浏览(262)

我正在从一个提升的PowerShell会话运行以下内容:
Start-Process .\file.bat -Verb RunAs -Wait
它在打开 bat 文件,但不是以管理员的身份打开的。有没有更好的办法?

fgw7neuy

fgw7neuy1#

*从提升的进程 * 启动的子进程本身也是提升的

  • 鉴于您正在从提升的PowerShell进程中运行,正如您所说,您可以在 * 当前 * 控制台窗口中直接*简单地调用批处理文件,这具有以下优点:
  • 执行是(默认情况下且不变地)* 同步 *。
  • 您可以捕获(或静默)批处理文件的输出(如果有的话)
  • 它的退出代码反映在自动变量$LASTEXITCODE中:
# From an already elevated session, invoking a batch file will run 
# it elevated too.
.\file.bat
  • 如果你想在一个单独的窗口中运行它,你可以使用你原来的命令(-Verb RunAs是隐含的,可以省略;* 否 * 无论哪种方式都显示UAC对话框)。
  • 从 * 非提升 * 会话运行时,您的**Start-Process-Verb RunAs方法是 * 需要的**,并且运行批处理文件的提升cmd.exe进程在 * 新窗口中运行。
    创建提升的cmd.exe进程时*注意 * re * 工作目录(无论是直接使用-FilePath cmd.exe,还是间接使用,例如-FilePath .\file.bat)或**powershell.exe进程(Windows PowerShell)**:
  • 提升后的进程的工作目录将 * 不变地 * 为C:\Windows\System32,而不管调用者的工作目录如何,也不管任何-WorkingDirectory参数如何,该参数被 * 忽略 *。
  • 其他可执行文件-特别是包括pwsh.exePowerShell (Core) 7+ CLI - do 继承调用者的工作目录。

换句话说:

你的方法可以简化,但它应该工作

  • 如果您意外地不被允许在提升的会话中执行操作,则问题必须与提升无关;值得注意的是,文件和文件夹可能具有甚至不允许管理员访问或修改的ACL。
  • 还要注意上面讨论的工作目录警告。
  • 验证批处理文件是否确实在 elevated 进程**中运行的一个简单方法是向其添加以下内容(依赖于net session只能从 elevated 进程成功调用的事实):
net session >NUL 2>&1 && echo ELEVATED || echo NON-elevated
  • 请注意,新窗口的标题栏是否以Administrator:开头 * 并不是 * 会话是否提升的可靠指标
  • 值得注意的是,使用Start-Process -Verb RunAs * 直接调用 * 批处理文件 * 不会 * 导致标题前缀出现,即使结果cmd.exe进程 * 被 * 提升(使用上面的命令进行验证)。
  • 只有当你通过cmd.exe * 调用 * 时,你才能看到前缀,你可以按照下面的方法来做(但请注意,它没有 * 功能 * 差异):
# Note: The batch file's *full path* must be passed, because 
#       the elevated process' working dir will be C:\Windows\System32 
#       if the caller is non-elevated.
Start-Process -Verb RunAs cmd.exe "/c `"$(Convert-Path .\file.bat)`""
khbbv19g

khbbv19g2#

你可以试试这样的方法:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{   
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process "$psHome\powershell.exe" -Verb runAs -ArgumentList $arguments

break
}

Start-Process .\file.bat -Verb RunAs -Wait

如果脚本在没有管理权限的情况下运行,则将显示提升表单。用户在弹出窗口中单击“是”后,您的文件将以管理员权限重新打开

6kkfgxo0

6kkfgxo03#

好吧,我无法得到任何东西运行时,管理员打开一个新窗口。我没有意识到我可以在同一个PowerShell会话中运行它,所以我把它改为只运行:
.\file.bat
这就是我想要的

相关问题