我正在尝试从另一个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登录。
答案 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),所有脚本都在同一目录中。
write-host "Testscript is run with user: $($env:USERNAME)"
Start-Sleep 2
runas /noprofile /user:%COMPUTERNAME%\myaccount "powershell.exe -NoProfile -ExecutionPolicy ByPass -file %~dp0testscript.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的一些评论
-NoNewWindow
似乎没有任何效果 - 打开一个新窗口-Noprofile
和-ExecutionPolicy Bypass
,以确保尽管执行策略设置或任何当前用户或机器配置文件脚本
但是,当从上面的CMD或PS1调用Powershell.exe时,至少参数-NoProfile
似乎不起作用。从PS1调用,我的机器配置文件仍然执行,但不是CMD ...有趣! MSDN: PowerShell.exe Command-Line Help 只是说明了这个参数:“不加载Windows PowerShell配置文件。”滑稽!其中有六个,请参阅Technet: Understanding the Six PowerShell Profiles。我使用“当前用户,当前主机 - 控制台”和“所有用户,当前主机 - 控制台”。经验教训,但我不确定这是一个错误还是一个功能。