在powershell脚本中本地运行代码块作为不同的用户

时间:2014-09-01 07:33:12

标签: windows powershell

这非常简单,但我无法得到任何工作。我想在特定用户下的powershell脚本中运行块代码。关键字是本地,我使用的是PowerShell 2.0。

Invoke-Command似乎需要远程主机?我运行以下内容,我看到的错误消息似乎也提示:

$strScriptUser = "DOMAIN\USER"
$strPass = "PASSWERD"
$PSS = ConvertTo-SecureString $strPass -AsPlainText -Force
$cred = new-object system.management.automation.PSCredential $strScriptUser,$PSS
Invoke-Command -ComputerName "." -scriptblock {
write-output "HI!"
} -Credential $cred

PowerShell 2.0不支持使用-ScriptBlock启动作业?我运行以下内容,我看到的错误消息似乎也提示:

$strScriptUser = "DOMAIN\USER"
$strPass = "PASSWERD"
$PSS = ConvertTo-SecureString $strPass -AsPlainText -Force
$cred = new-object system.management.automation.PSCredential $strScriptUser,$PSS
Start-Job -ScriptBlock {
write-output "HI!"
} -Credential $cred

我做错了什么,还是有另一种方式?

补充:这是我首先要做的。我正在进行一项计划任务,该任务在用户登录/解锁将登录信息写入文件的终端时运行。计划任务作为本地用户运行,以获取用户名,配置文件等信息。然后使用不同的用户帐户将登录信息写入日志文件,该帐户是唯一可以修改文件的帐户。为了阻止访问脚本中的登录凭据,我使用PS2EXE将脚本转换为EXE。

3 个答案:

答案 0 :(得分:2)

这是另一种方式。

# Get the other user's credentials
$credential = Get-Credential

# Execute a scriptblock as another user
$commands = @'
    $env:username
    # ... more commands ...
'@
Start-Process -FilePath Powershell -LoadUserProfile -Credential $credential -ArgumentList '-Command', $commands

# Execute a file as another user 
$script = '.\path\name.ps1'
Start-Process -FilePath Powershell -LoadUserProfile -Credential $credential -ArgumentList '-File', $script

使用-LoadUserProfile开关,如果用户的配置文件尚不存在,则可以创建额外的好处。

答案 1 :(得分:1)

查看您未向我们展示的错误消息会有所帮助,但我认为您的问题的答案是在尝试使用Invoke-Command时使用PowerShell远程处理。计算机名称.localhost一样正常,但您必须在计算机上启用远程处理才能执行此操作。

要启用远程处理,请在powershell中运行Enable-PSRemoting,或在常规命令提示符下运行winrm quickconfig

如果您已启用远程处理,则可能尝试使用非管理用户进行远程处理。如果是这种情况,请查看Get-PSSessionConfiguration的输出。您将获得端点列表和应用的权限。

默认情况下,您要连接的端点名为Microsoft.Powershell,您可以使用Set-PSSessionConfiguration更改权限(请务必使用-ShowSecurityDescriptorUI参数,除非您想要使用SDDL )。

但是,不应该这样做,应该已经有一个名为BUILTIN\Remote Management Users的访问权限,您可以添加有限的用户。

如果这些都没有帮助,请提供更多详细信息和错误消息。

修改

在看到你最终想要完成的事情的解释后,我还有另一个建议。

  1. 您现有的计划任务会将信息写入已知位置。
  2. 在特权用户帐户下运行的其他计划任务会获取该信息并将其放入受限用户无法访问的文件中。
  3. Bonus:从第一个任务开始第二个任务。
  4. 这可能是一种快速妥协,可以在没有远程处理的情况下执行您想要的操作,也不会暴露特权用户的凭据。

    当前方法的问题:

    我对您最初想法的主要问题是您需要将凭据嵌入到脚本中,因此受限用户无论如何都可以访问可以修改文件的帐户凭据。

    理想情况下:

    您可以使用有限用户的PowerShell脚本调用Web服务,在该脚本中,您只能为其提供登录信息,而不会返回任何内容。因此,您可以点击一个URL并使用您要记录的数据执行POST或其他任何操作,但该用户无法检索任何信息。这可能有点超出你愿意为此做的事情。

答案 2 :(得分:1)

另一种方法是压制,如果你不愿意启用远程处理,这是一个很好的选择。

检查一下 - https://web.archive.org/web/20170410101407/poshcode.org/1867

您应该只导入此模块并将代码放在

之间
  

Push-ImpersonationContext $ credential

  

弹出ImpersonationContext