如何在本地系统帐户下运行CMD.exe?

178

我目前在使用Windows Vista系统,并且希望手动完成与我的Windows服务相同的操作。由于Windows服务是在本地系统账户下运行,我希望模拟这种行为。基本上,我想要在本地系统账户下运行CMD.EXE。

我在网上找到了一些信息,建议使用DOS任务计划程序AT命令来启动CMD.exe,但我收到了一个Vista警告,提示“由于安全增强,此任务将按预期时间运行,但不会交互。”以下是示例命令:

AT 12:00 /interactive cmd.exe

另一个解决方案建议通过服务控制(sc.exe)创建一个次要的 Windows 服务,该服务仅启动 CMD.exe。

C:\sc create RunCMDAsLSA binpath= "cmd" type=own type=interact
C:\sc start RunCMDAsLSA

在这种情况下,服务无法启动并生成以下错误消息:

FAILED 1053: The service did not respond to the start or control request in a timely fashion.

第三个建议是通过计划任务启动CMD.exe。尽管您可以在各种帐户下运行计划任务,但我不认为本地系统帐户是其中之一。

我也尝试了使用Runas,但认为我遇到了与运行计划任务时相同的限制。

到目前为止,我的每个尝试都以失败告终。有什么建议吗?


这个问题的任何答案都适用于Windows 10吗? - Throw Away Account
11个回答

271
尽管我个人没有测试过,但我有充分的理由相信上述AT命令解决方案适用于XP、2000和Server 2003。根据我的和Bryant的测试,我们发现相同的方法在Vista或Windows Server 2008上不起作用——很可能是由于增加了安全性以及交互式开关被弃用。
然而,我发现了这篇文章,它展示了如何使用SysInternals(该公司在2006年被Microsoft收购)的PSTools。我通过以下方式启动了命令行,并突然神奇地运行在本地管理员帐户下:
psexec -i -s cmd.exe

PSTools效果很好。它是一组轻量且文档完备的工具,为我的问题提供了适当的解决方案。

非常感谢那些提供帮助的人。


17
我更喜欢在加上“-d”后使用,这样我就可以继续使用我从中启动它的控制台。 - SamB
1
我刚在Vista x64上尝试,结果显示“在...上运行的PsExec服务是不兼容的版本。”已经尝试直接从\live.sysinternals.com\tools\psexec和最新二进制文件,似乎没有x64版本。 - ZXX
这似乎只适用于旧版本的PsExec,如v2.20,新版本不允许此操作。还要记住,使用SYSTEM帐户运行非常危险,因为它可以无限制地访问Windows的内部,并且如果使用不当可能会造成真正的损害。很难找到旧版本,我在这里找到了一个链接,其中包含PsExec v2.20的旧版PsTools zip文件 - 使用时请自行承担风险,我无法保证该站点或文件的真实性 - https://t1.daumcdn.net/cfile/tistory/993BE34E5A925D232C - rboy
2
"\live.sysinternals.com@SSL\DavWWWRoot\tools\PsExec.exe" -i -s cmd.exe 对我有用 - Bagley

74
  1. 从Sysinternals下载psexec.exe
  2. 将其放在C:\驱动器中。
  3. 作为标准或管理员用户登录,并使用以下命令:cd \。这将把您置于驱动器的根目录中,即psexec所在的位置。
  4. 使用以下命令:psexec -i -s cmd.exe其中-i是交互式,-s是系统帐户。
  5. 命令完成后,将启动cmd shell。键入whoami;它会说“system”
  6. 打开任务管理器。结束explorer.exe。
  7. 从提升的命令shell中键入start explorer.exe
  8. 当启动资源管理器时,在开始菜单栏中注意到名称“system”。现在,您可以删除一些位于system32目录中的文件,管理员无法删除这些文件,或者您必须尝试努力更改权限才能删除这些文件。

尝试重命名或删除Windows的任何受保护目录中的系统文件的用户应该知道,所有Windows文件都受到DACLS的保护,当您重命名文件时,您必须更改所有者并替换拥有文件的TrustedInstaller,并将任何用户(如属于管理员组的用户)作为文件的所有者,然后尝试更改权限后再进行重命名,这样就可以工作了。当您以内核特权运行Windows Explorer时,出于安全原因,您在网络访问方面受到一定限制,这仍然是我要找回访问权限的研究课题。


我经常使用这个技巧来启动管理员用户的资源管理器。特别是在通过VNC连接到需要设置网络设置的计算机时。我给它点赞。 - TPAKTOPA
1
这个技巧现在似乎已经失效了。我的操作系统是Windows 7 SP1。我已经找到了开始菜单栏中的“系统”。但是,当我尝试重命名system32文件夹中的文件时,它仍然显示权限被拒绝。system32文件夹现在归TrustedInstaller所有,即使本地系统帐户也只有特殊权限。 - Shaohua Li
如果您尝试重命名或删除位于任何受保护的Windows目录中的文件,它将由TrustedInstaller拥有,您当前的用户必须通过更改权限来拥有该文件,然后才能重命名或删除它。这经常用于删除slmgr.exe和其他系统文件,以获取无限制访问Windows试用版而无需付费。 - raven

11

在这里找到了一个答案(链接),它似乎通过在binPath参数中添加/k start来解决该问题。那么你就可以得到:

sc create testsvc binpath= "cmd /K start" type= own type= interact

然而,本说这对他没有用,当我在Windows Server 2008上尝试时,它确实在本地系统下创建了cmd.exe进程,但它不是交互式的(我无法看到窗口)。

我不认为有一种简单的方法可以完成您的要求,但我想知道为什么您要这样做?您只是想查看运行服务时发生了什么吗?看起来您可以使用日志记录来确定发生了什么,而不必将exe作为本地系统运行...


嗨,Bryant。这个解决方案基本上在问题中已经概述了。它对你实际起作用吗?我用它会导致失败。谢谢。 - Ben Griswold
Bryant,我有一个服务来管理另一个组件的安装和卸载。如果我的服务无法完成工作,我想为我们的支持团队提供一种简单的方法来“强制”卸载该组件。在测试期间,我也希望能够“强制”卸载。谢谢你的帮助。 - Ben Griswold
1
@Ben:你的“交互式服务检测”启动类型设置为“手动”还是“禁用”? - Hello71
1
为了允许Server 2012的交互式服务,需要将HKLM\SYSTEM\CurrentControlSet\Control\Windows\NoInteractiveServices设置为0(默认值为1)。 - Ivan Chau
显示剩余2条评论

6

使用安全桌面以系统身份运行cmd.exe

我们可以通过附加调试器轻松地在Windows XP/Vista/7/8.1中通过CMD获得内核访问权限:

REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\osk.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe"
  1. Run CMD as Administrator

  2. Then use this command in Elevated:

     CMD REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\osk.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe"
    
  3. Then run osk (onscreenkeyboard). It still does not run with system Integrity level if you check through process explorer, but if you can use OSK in service session, it will run as NT Authority\SYSTEM

我有一个想法,你需要在安全桌面上运行它。

以管理员身份启动任何文件。当UAC提示出现时,只需按下Win+U并启动OSK,它将启动CMD。然后在提升的提示符中,键入whoami,您将得到NT Authority\System。之后,您可以从系统命令 shell 启动 Explorer 并使用 System 配置文件,但基于安全原因,您在使用 SYSTEM 权限时受到一定的网络限制。我会在之后添加更多解释,因为我在一年前发现了这个方法。

如何实现的简要说明

在不使用PsExec的情况下,以本地系统帐户身份运行Cmd.exe。此方法使用先前发现的调试器陷阱技术,该技术具有自己的好处,可以用于在调试器中陷入某些狡猾/恶意的蠕虫或恶意软件,并运行其他 exe 以停止传播或暂时防止损坏。在此注册表键中,屏幕键盘被陷入 Windows 原生调试器并运行 cmd.exe,但 cmd 仍将以已登录用户的权限运行。但是,如果我们在 session0 中运行 cmd,则可以获得系统 shell。因此,我们在此添加另一个想法,即将 cmd 跨度放在安全桌面上。请记住,安全桌面在 system 帐户下的 session 0 中运行,并且我们将获得系统 shell。因此,每当您以提升的身份运行任何内容时,您必须回答 UAC 提示,并且 UAC 提示会出现在黑色的非交互式桌面上。一旦看到它,您就必须按下Win+U,然后选择OSK,您将获得以本地系统权限运行的CMD.exe。还有更多方法可以使用CMD来获得本地系统访问权限。


嗯,有更多的方法可以使用NT权限特权以提升身份运行cmd。 - raven
这非常好。非常好。我讨厌依赖第三方插件来完成某些事情。这个超级快速和容易。而且是永久的 :-) 唯一的问题是你必须在UAC窗口中运行所有命令,而且只有一些应用程序会打开。例如,Explorer.exe不会打开。我想尝试是否有另一种方法来触发这个。我希望能够在本机Windows环境中运行其他应用程序,而不受UAC限制某些应用程序。太棒了Raven! - KonaRin
在 Server 2022 上对我无效。按下 Win + U 只会打开屏幕键盘,而不是命令提示符? - undefined

4

另一个替代方案是使用Process hacker,如果你进入“以管理员身份运行”(Interactive对于启用了安全增强的用户不起作用,但这并不重要),当窗口打开时,在框中输入“服务”,在用户框中输入“SYSTEM”,在路径框中输入“C:\Users\Windows\system32\cmd.exe”,其余部分保持不变,点击确定,你就会得到一个带有cmd的窗口,并以系统身份运行。现在你可以按照其他步骤自己操作,因为我假设你已经知道它们。


2
使用任务计划程序,在 SYSTEM 下运行 CMDKEY,并使用适当的参数 /add: /user: 和 /pass: 进行安排。
无需安装任何东西。

2

还有另一种方法。有一个名为PowerRun的程序,允许运行提升的cmd命令。即使具有TrustedInstaller权限也可以。它允许使用控制台和GUI命令。


2

(评论)

我目前还不能发表评论,所以在这里发布...我刚刚尝试了上述的OSK.EXE调试技巧,但是当我将填好的"C:\windows\system32\cmd.exe"保存到已创建的Debugger键时,注册表编辑器立即关闭,因此微软正在积极阻止使用本机方法来执行此操作。这真的很奇怪,因为其他事情不会触发这种情况。

使用任务计划程序确实会创建一个SYSTEM CMD,但它位于系统环境中,而不是显示在人类用户配置文件中,因此现在也已经失效(尽管它是合理的)。

当前在Microsoft Windows [版本10.0.20201.1000]

因此,在这一点上,必须使用第三方软件来进行调解,而且微软这些天更加积极地封锁进一步的技巧。


1

如果你可以编写一个不需要交互的批处理文件,尝试将该批处理文件作为服务运行,来完成需要完成的任务。


1

我使用RunAsTi实用程序以TrustedInstaller(高特权)身份运行。该实用程序甚至可以在Windows的恢复模式下使用(通过执行Shift+Restart进入的模式),而psexec实用程序在那里无法工作。但是,您需要将C:\WindowsC:\Windows\System32(而不是X:\WindowsX:\Windows\System32)路径添加到PATH环境变量中,否则RunAsTi在恢复模式下不起作用,它只会打印:AdjustTokenPrivileges for SeImpersonateName: Not all privileges or groups referenced are assigned to the caller


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接