如何让PowerShell作为标准用户运行程序?

时间:2015-07-16 08:53:01

标签: powershell

好吧,所以,我一直在网上搜索,我根本找不到任何东西。

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

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

4 个答案:

答案 0 :(得分:3)

您可以使用psexec

psexec -l powershell.exe -executionpolicy unrestricted -noexit -file c:\temp\checkelevated.ps1
  

-l:以受限用户身份运行进程(剥离Administrators组并仅允许分配给Users组的权限)。在Windows Vista上   该过程以低完整性运行。

答案 1 :(得分:0)

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

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

runas /user:%USERNAME% program.exe

USERNAME环境变量应该包含当前登录的用户,即使在高架环境中也是如此。

答案 2 :(得分:0)

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

然而....

thisthisthis是否描述了您实际遇到的问题?目前还不清楚你要做什么。你已经从你的问题中删除了所有上下文。

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

如果你真的,真的需要模仿登录用户 - 我真的很难想到我需要从脚本中执行此操作的情况 - 然后阅读。

不需要用户凭据知识的替代方案是:

  1. 使用用户登录脚本而不是计算机启动脚本。如有必要,请为本地用户授予运行其余脚本所需的权限。我无法想象你还没有想到这一点。
  2. 创建一个作为“域用户”运行的计划任务或代表相关用户的其他组,并选中“仅在登录时运行”。同样,您需要授予用户运行脚本其余部分所需的权限,但不会将您限制为仅登录。
  3. 编写一个调用ImpersonateLoggedOnUser的程序,该程序需要SeImpersonatePrivilege(管理员默认使用此功能,IIRC)。这些是本机Win32调用,而不是.Net,因此在PowerShell中使用它们并不简单。自从我看过这个问题已经过去了大约十年,它曾经是一个巨大的痛苦,因为它有时仍会提示凭证。我不得不认为Vista和后来(UAC等人)的安全性增加会使情况变得更糟。我也不知道你是否可以访问映射的驱动器(即,如果模拟存在网络跃点)。我大概永远不会选择这种方法。
  4. 对于其他任何事情,我认为您将需要当前用户的凭据。您要做的就是凭证劫持,并且操作系统安全性是专门为而不是而设计的。

答案 3 :(得分:0)

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

  1. 创建任务(schtasks /create /tn "MyTask" /tr "powershell -file...." /ru "domain\username"
  2. 运行任务(schtasks /run /tn "MyTask"
  3. 删除任务(schtasks /delete /tn "MyTask"
  4. 您只需要您的脚本来获取当前用户,这可以通过多种不同方式完成。我也在这些对schtasks的调用之间暂停了2秒,以确保它们全部运行。