Start-Process powershell凭据不起作用,但在使用cmd时它可以

时间:2017-06-13 10:50:20

标签: powershell

我正在尝试从另一个PowerShell脚本运行一个powershell脚本,该脚本传入另一个用户的凭据,然后使用凭据:

Start-Process powershell.exe -Credential "LON\my-user" -NoNewWindow -ArgumentList "-file C:\DevopsScripts\stuckApps.ps1"

我有很多不同的方法都会得到同样的错误。我尝试在命令之前设置用户名和密码:

$username = "LON\my-user"
$password = "pass"
$PSS = ConvertTo-SecureString $password -AsPlainText -Force
$cred = new-object system.management.automation.PSCredential $username,$PSS
$env:USERNAME 
Start-Process powershell.exe -Credential $cred -NoNewWindow -ArgumentList "-file C:\DevopsScripts\stuckApps.ps1"

但我尝试的一切都会收到错误:

  

Start-Process:由于错误导致无法运行此命令:用户名或密码不正确。

我知道用户名和密码是正确的,因为它们已在cmd上测试过,它运行正常:

C:\Users\ADM-me>runas /noprofile /user:LON\my-user"powershell.exe C:\DevopsScripts\stuckApps.ps1"

我在这里做错了什么以及如何解决这个问题,最好事先通过设置密码,这样就可以实现自动化。这也不需要使用Start-Process来完成,这是我能找到的最接近工作的东西。

我认为我遇到的问题是,在卡住的应用中它有这个:

$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Server = mssql.co.uk; Database = mydata; Integrated Security = true;"
$conn.Open()

我需要这个来运行我试图通过它的凭据,否则我收到此错误。  `异常调用"打开"用" 0"参数:"登录失败。登录来自不受信任的域,不能与Windows身份验证一起使用。"

但是我无法通过凭证,因为唯一有效的是管理员,(我有,但那会抛出上面的错误)。我是否可以使用管理员登录来访问卡住的应用程序,然后使用连接卡住的应用程序所需的登录作为AD登录。

1 个答案:

答案 0 :(得分:1)

您对-Credential "LON\my-user"的第一次尝试无效,但您的第二次尝试是正确的,根据需要构建了PSCredential类的对象(请参阅Get-Help Start-Process -Parameter Credential中的类型,它是 PSCredential 而不是字符串)。我在这里尝试了一些重用的代码,它在这里工作,或者CMD和PS1通过Powershell.exe调用PS1测试脚本,使用本地测试帐户(抱歉,没有域@home)。

即使我的代码不相同且用户的域名是本地机器,但与您的相比,这种方法是相同的 - 抱歉这不能解决您的问题 - 我没有看到你正在做某事错

为了安全起见,请确保使用相同的Powershell版本进行测试,下面的脚本在W10 1607下执行(所以Powershell 5.1.14393.1198),所有脚本都在同一目录中。

testscript.ps1

write-host "Testscript is run with user: $($env:USERNAME)"
Start-Sleep 2

testrun.cmd

runas /noprofile /user:%COMPUTERNAME%\myaccount "powershell.exe -NoProfile -ExecutionPolicy ByPass -file %~dp0testscript.ps1"

testrun.ps1

$Username       = "$($env:COMPUTERNAME)\myaccount"
$Password       = 'mypassword'
$SecurePassword = ConvertTo-SecureString -String $Password -AsPlainText -Force
$ScriptFile     = Join-Path -Path $PSScriptRoot -ChildPath 'testscript.ps1'
$Credential     = New-Object System.Management.Automation.PSCredential( $Username, $SecurePassword)
$StartOpts = @{ 'FilePath'        = 'powershell.exe'
                'Credential'      = $Credential
                'NoNewWindow'     = $false
                'ArgumentList'    = @( '-f', $ScriptFile,
                                       '-ExecutionPolicy', 'Bypass',
                                       '-NoProfile'
                                     )
               }
Start-Process @StartOpts

有关testrun.ps1的一些评论

  • 不要介意将Start-Process作为哈希表传递的参数,它对我来说更易读,否则没有区别
  • ArgumentList在这里作为字符串数组传递 - 我更喜欢这种方式,因此它会自动处理双重qouting参数,例如:当脚本目录的路径名包含空格
  • 传递给Start-Process的参数-NoNewWindow似乎没有任何效果 - 打开一个新窗口
  • 我总是建议在使用Powershell.exe启动脚本或执行命令时添加参数-Noprofile-ExecutionPolicy Bypass,以确保尽管执行策略设置或任何当前用户或机器配置文件脚本 但是,当从上面的CMD或PS1调用Powershell.exe时,至少参数-NoProfile似乎不起作用。从PS1调用,我的机器配置文件仍然执行,但不是CMD ...有趣! MSDN: PowerShell.exe Command-Line Help 只是说明了这个参数:“不加载Windows PowerShell配置文件。”滑稽!其中有六个,请参阅Technet: Understanding the Six PowerShell Profiles。我使用“当前用户,当前主机 - 控制台”和“所有用户,当前主机 - 控制台”。经验教训,但我不确定这是一个错误还是一个功能。