You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中如何向要求SSO验证的网页传递登录用户名和密码

PowerShell 实现 ServiceNow 自动登录访问工单解决方案

原代码不生效的原因

Invoke-WebRequest 的 -Credential 参数仅支持 HTTP 基本认证、NTLM/Kerberos 这类 HTTP 协议层面的身份校验,而你遇到的 ServiceNow 登录是 HTML 表单提交的业务层校验逻辑,两者不兼容,因此传入的凭证无法被识别。

可用实现方案

方案1:后台模拟表单提交(无需打开浏览器)

适合只需要后台获取工单数据的场景:

# 配置地址和凭证
$loginUrl = "https://servicemanagement.contoso.net/login.do" # 替换为实际的ServiceNow登录页面地址
$targetTicketUrl = "https://servicemanagement.contoso.net/textsearch.do?sysparm_ck=dummy&sysparm_tsgroups=&sysparm_view=text_search&sysparm_search=INC00011064"
$creds = Get-Credential -Message "输入SSO账号密码"

# 首次请求登录页,获取表单结构和会话
$loginPage = Invoke-WebRequest -Uri $loginUrl -SessionVariable snSession
$loginForm = $loginPage.Forms[0]

# 填充表单字段
$loginForm.Fields["USER"] = $creds.UserName
$loginForm.Fields["PASSWORD"] = $creds.GetNetworkCredential().Password

# 提交登录请求
$authResult = Invoke-WebRequest -Uri ($loginUrl + $loginForm.Action) -Method Post -Body $loginForm.Fields -WebSession $snSession

# 用已认证的会话访问目标工单页面
$ticketPage = Invoke-WebRequest -Uri $targetTicketUrl -WebSession $snSession

# 输出页面内容验证是否登录成功
$ticketPage.Content

方案2:Selenium 自动操作浏览器(可视化场景)

如果需要实际打开浏览器展示工单页面,可以使用 Selenium 模块实现自动填单提交:

# 首次使用先安装Selenium模块
Install-Module Selenium -Scope CurrentUser -Force

# 启动Chrome浏览器
Import-Module Selenium
$browser = Start-SeChrome

# 打开工单地址,会自动跳转登录页
$browser.Navigate().GoToUrl($targetTicketUrl)
Start-Sleep -Seconds 2

# 填充账号密码
$creds = Get-Credential -Message "输入SSO账号密码"
$browser.FindElementByName("USER").SendKeys($creds.UserName)
$browser.FindElementByName("PASSWORD").SendKeys($creds.GetNetworkCredential().Password)

# 提交登录
$browser.FindElementByName("PASSWORD").Submit()

注意事项

  • 若登录表单包含隐藏的 CSRF 令牌字段,无需额外修改,直接提交表单即可,字段值会被自动带上
  • 若登录后跳转逻辑复杂,可以适当延长 Start-Sleep 的等待时长,保证页面元素加载完成后再操作

内容的提问来源于stack exchange,提问作者user17514081

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:45:06