【问题标题】:Start-Process powershell credentials don't work but when using cmd it doesStart-Process powershell 凭据不起作用,但在使用 cmd 时它起作用
【发布时间】:2017-06-13 10:50:19
【问题描述】:

我正在尝试从另一个 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”参数调用“Open”的异常:“登录失败。登录来自不受信任的域,不能用于 Windows 身份验证。”

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

【问题讨论】:

  • 你试过 $cred = Get-Credential 吗?这并不能真正解决您的问题,因为您必须在运行时输入凭据,但它可能会让您了解自己做错了什么。
  • 请注意(即使这样有效)它不会让您绕过 UAC 提示符。
  • 不,仍然是同样的错误,正如@Bill_Stewart 所说,它不会绕过 UAC 提示
  • 可能是您一开始就以错误的方式解决问题,您的stuckApps.ps1 脚本是做什么的?
  • 我的意思是,如果您的目标是绕过 UAC 提示符,那么您的努力是徒劳的。你不能。 UAC 提示的全部目的是从管理用户那里获得确认。

标签: powershell


【解决方案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。我使用“当前用户,当前主机 - 控制台”和“所有用户,当前主机 - 控制台”。吸取的教训,但我不确定这是错误还是功能。

【讨论】:

    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多