如何使PowerShell以标准用户身份运行程序?



好吧,我一直在网上搜索,但我根本找不到关于这个的任何东西。

基本上,我想做的是从一个提升的PowerShell脚本运行一个程序,但我希望这个程序以标准用户身份运行。

我需要这样做,因为我需要运行的程序需要访问映射的网络驱动器,而域管理员帐户没有访问权限。因此,我基本上需要一行代码来将脚本从提升模式中取出,或者对Start-Program命令进行一些扩展,使其以登录用户而不是脚本运行的管理员帐户的身份运行。

可以使用psexec

psexec -l powershell.exe -executionpolicy unrestricted -noexit -file c:tempcheckelevated.ps1

-l:以受限用户身份运行进程(剥离Administrators组,只允许分配给Users组的特权)。在Windows Vista上

进程以低完整性运行。

我过去经常使用的一种方法是动态地创建一个计划任务,指定当前登录的用户作为将运行该任务的帐户。该任务将运行一些其他脚本、命令等,并且它将在登录用户的上下文中发生。这可以通过使用Start-Process调用schtasks.exe程序来实现,该程序将…

  1. 创建任务(schtasks /create /tn "MyTask" /tr "powershell -file...." /ru "domainusername")
  2. 执行任务(schtasks /run /tn "MyTask")
  3. 删除任务(schtasks /delete /tn "MyTask")

您只需要脚本获取当前用户,这可以通过许多不同的方式完成。我还在这些对schtasks的调用之间设置了2秒暂停,以确保它们都运行。

我想有更多的方法可以做到这一点(可能有些甚至更好),但这应该也可以。

如果您需要在提升的环境中以当前登录的用户运行可执行文件或脚本,您可以使用RunAsUSERNAME环境变量作为user参数传递:

runas /user:%USERNAME% program.exe

USERNAME环境变量应该包含当前登录的用户,即使是在升级环境中。

通常预期和接受的方法是指定网络UNC路径而不是网络驱动器。如果需要,您甚至可以在提升进程中重新映射驱动器。你就该这么做。如果您有一个帐户运行一个需要访问网络位置的进程,正确的答案是授予该帐户完成其工作所需的访问权限。

然而…

这个或这个或这个描述了你实际遇到的问题吗?很不清楚你想做什么。你的问题没有上下文。

如果您正在尝试运行一个脚本,该脚本需要运行提升并需要访问用户的网络驱动器,而您由于某种原因无法使用UNC路径,那么您可能需要以上三个链接。


如果您确实需要模拟一个登录的用户——我真的很难想到需要从脚本中执行此操作的情况——那么请继续阅读。

不需要了解用户凭证的替代方法有:

  1. 使用用户登录脚本而不是计算机启动脚本。如果有必要,授予本地用户运行脚本其余部分所需的权限。我无法想象你还没有想到这一点。
  2. 创建一个计划任务,以"域用户"或代表所讨论的用户的其他组的身份运行,并勾选"仅在登录时运行"。同样,您需要授予用户运行脚本其余部分所需的权限,但它不会将您束缚在登录上。
  3. 编写一个调用ImpersonateLoggedOnUser的程序,它需要seimpersonatepri特权(默认情况下管理员有这个特权,IIRC)。这些都是原生的Win32调用,而不是。net调用,因此在PowerShell中使用它们并不简单。我看这个已经有十年了,它曾经是一个巨大的痛苦,因为它有时仍然会提示凭证。我不得不认为,Vista及其后续版本(UAC等)中增强的安全性会使情况变得更糟。我也不知道您是否可以访问映射的驱动器(即,如果模拟在网络跳中幸存下来)。我几乎永远不会选择这种方法。

对于其他内容,我认为您将需要当前用户的凭据。你所做的是凭证劫持,而操作系统的安全是专门设计的而不是允许这种情况发生。

最新更新