我有两个脚本位于C:\ setup:script.ps1和script1.ps1。
我希望能够以脚本.ps1作为另一个用户运行script1.ps1并且具有提升的权限但我无法使其工作。新的PowerShell窗口打开但立即关闭......
这是脚本:
$cspath = $MyInvocation.MyCommand.Path
$sfolder = Split-Path $cspath
$spath = Join-Path $sfolder "\Script1.ps1"
$sa = "domain\user"
$sap = "userpassword"
$sasp = ConvertTo-SecureString -String $sap -AsPlainText -Force
$sac = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $sa, $sasp
Start-Process $PSHOME\powershell.exe `
-Credential $sac `
-ArgumentList "-Command Start-Process $PSHOME\powershell.exe -ArgumentList `"'$spath'`" -Verb Runas" -Wait
任何帮助将不胜感激......
答案 0 :(得分:2)
您可能需要调整powershell.exe
的参数。您应该使用-ArgumentList
参数,而不是使用我认为无效的-File
。此外,您还需要使用-ExecutionPolicy Bypass
参数来确保脚本执行策略不会干扰。
最后,我建议删除脚本路径周围的单引号,因为Windows命令解释程序不理解环绕参数的单引号。
尝试一下:
$ArgumentList = '-Command Start-Process -FilePath $PSHOME\powershell.exe -ArgumentList "-ExecutionPolicy Bypass -File \"{0}\"" -Verb Runas' -f $sPath;
Start-Process $PSHOME\powershell.exe `
-Credential $sac `
-ArgumentList $ArgumentList -Wait
似乎一些引用规则也在这里,因为我们将一个命令嵌入到另一个命令中。我在PowerShell v4.0上编写并测试了一个完整的函数脚本。
以下是内容:
# Create test directory and script file
[void](New-Item -Path c:\test -ItemType Directory -Force);
Set-Content -Path c:\test\test1.ps1 -Value 'Add-Content -Path $PSScriptRoot\blah.txt -Value (Get-Date);';
# Get credential and define script path
$Credential = Get-Credential;
$ScriptPath = 'c:\test\test1.ps1';
# Define the command line arguments
$ArgumentList = 'Start-Process -FilePath powershell.exe -ArgumentList \"-ExecutionPolicy Bypass -File "{0}"\" -Verb Runas' -f $ScriptPath;
Start-Process -FilePath powershell.exe `
-Credential $Credential `
-ArgumentList $ArgumentList -Wait -NoNewWindow;
我可以确认我收到了UAC提示,并且目标脚本已成功执行。
答案 1 :(得分:0)
由于您担心新会话窗口关闭,我猜你想要命令行输出。
Start-Process
正在按计划运作。它将运行通过-ArgumentList
传入的脚本并退出会话。这意味着它不会保持显示命令行输出 - 会话将在进程完成后立即终止。
如果您想要持久会话,请使用New-PSSession。否则,您可以将收集的数据导出到文件中。