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

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

Invoke-Command似乎需要远程主机? 我运行以下和我看到的错误消息似乎build议尽可能多:

$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开始作业? 我运行以下和我看到的错误消息似乎build议尽可能多:

 $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 

我做错了什么,或者有其他的方法吗?

补充:这是我想要做的第一件事。 我正在执行一个计划任务,当用户login/解锁将login信息写入文件的terminal时运行。 计划任务以本地用户身份运行,以获取用户名,个人资料等信息。 login信息然后被写入到一个日志文件使用不同的用户帐户,这是唯一的帐户,可以修改该文件。 要阻止访问脚本中的login凭据,我将脚本转换为使用PS2EXE的EXE。

另一种方法是加密,如果你不愿意启用远程处理,这是不错的选择。

看看这个 – http://poshcode.org/1867

你应该只是导入这个模块,并把你的代码之间

Push-ImpersonationContext $凭证

弹出式ImpersonationContext

这将有助于查看您没有向我们显示的错误消息,但是我认为您的问题的答案是使用PowerShell远程处理与您尝试使用Invoke-Command 。 计算机名称. 作为localhost是好的,但你必须在你的机器上启用远程处理。

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

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

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

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

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

编辑

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

  1. 您现有的计划任务将信息写入已知位置。
  2. 在特权用户帐户下运行的不同计划任务将获取该信息并将其放入受限用户无法访问的文件中。
  3. 奖励:从第一个任务开始第二个任务。

这可能是一个快速的妥协做你想要的,而不需要远程处理,而不暴露特权用户的凭据。

目前的做法存在问题:

我最初的想法存在的主要问题是您将需要将凭证嵌入到脚本中,因此受限用户将有权访问可以修改文件的帐户的凭据。

理想的情况是:

你将有一个Web服务,你可以调用你的有限的用户PowerShell脚本中,你只能给它的登录信息,并没有得到任何回报。 所以你打了一个URL,并做一个POST或任何你想记录的数据,但该用户不能检索任何信息。 这可能超出了你愿意为此做的事情。

这是另一种方式。

 # 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开关,如果用户的配置文件尚不存在,则可以创建用户配置文件。