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

wri*_*edx 8 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我做错了什么,还是有其他办法?

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

Nat*_*ley 6

这是另一种方式。

# 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
Run Code Online (Sandbox Code Playgroud)

使用 -LoadUserProfile 开关,这具有创建用户配置文件(如果尚不存在)的额外好处。


bri*_*ist 1

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

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

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

默认情况下,您连接到的端点将被调用Microsoft.Powershell,您可以使用以下命令更改权限Set-PSSessionConfiguration(请务必使用-ShowSecurityDescriptorUI参数,除非您想弄乱 SDDL)。

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

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

编辑

在看到您最终想要完成的任务的解释后,我有另一个建议给您。

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

这可能是一种快速妥协,可以在不进行远程处理且不暴露特权用户凭据的情况下执行您想要的操作。

当前方法的问题:

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

理想情况下:

您将拥有一个可以使用受限用户 powershell 脚本调用的 Web 服务,在该脚本中您只能向其提供登录信息,而无法获取任何信息。因此,您可以点击一个 URL,并对POST您想要记录的数据执行操作或其他操作,但该用户无法检索任何信息。这可能有点超出您愿意为此做的事情。