这非常简单,但我无法得到任何工作。我想在特定用户下的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。
答案 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
的访问权限,您可以添加有限的用户。
如果这些都没有帮助,请提供更多详细信息和错误消息。
在看到你最终想要完成的事情的解释后,我还有另一个建议。
这可能是一种快速妥协,可以在没有远程处理的情况下执行您想要的操作,也不会暴露特权用户的凭据。
我对您最初想法的主要问题是您需要将凭据嵌入到脚本中,因此受限用户无论如何都可以访问可以修改文件的帐户凭据。
您可以使用有限用户的PowerShell脚本调用Web服务,在该脚本中,您只能为其提供登录信息,而不会返回任何内容。因此,您可以点击一个URL并使用您要记录的数据执行POST
或其他任何操作,但该用户无法检索任何信息。这可能有点超出你愿意为此做的事情。
答案 2 :(得分:1)
另一种方法是压制,如果你不愿意启用远程处理,这是一个很好的选择。
检查一下 - https://web.archive.org/web/20170410101407/poshcode.org/1867
您应该只导入此模块并将代码放在
之间Push-ImpersonationContext $ credential
和
弹出ImpersonationContext