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
相关产品推荐
相关产品推荐

