【问题标题】:Populate username/password in webpage with Powershell使用 Powershell 在网页中填充用户名/密码
【发布时间】:2020-07-07 08:19:17
【问题描述】:

我正在尝试在摩托罗拉路由器的登录页面中填充用户名和密码。页面部分HTML如下:

<form name="login" onsubmit="return loginSubmit()" action="/goform/login" method="POST"> 
  <div id="moto-login">

    <some divs snipped>

    <div id="moto-username">
    <input name="loginUsername" class="moto-username-input" onfocus="onFocusUsername()" onblur="onBlurUsername()" type="text" value="Username">
    </div>

    <some divs snipped>

  </div>
</form>

我正在使用 PowerShell,并尝试获取值字符串的句柄。我可以这样做:

$ie.Document.IHTMLDocument3_getElementById("moto-username").innerHTML

得到这个:

<input name="loginUsername" class="moto-username-input" onfocus="onFocusUsername()" onblur="onBlurUsername()" type="text" value="Username">

…但我看不到如何设置变量。这是因为&lt;div&gt;s的嵌套吗?

我尝试过各种形式,比如:

$iePPM.Document.IHTMLDocument3_getElementById("moto-username") = "myusername"

……但没有任何效果。

TIA!

【问题讨论】:

  • 对不起,忘了补充,我明白了:

标签: html powershell authentication


【解决方案1】:

你并不是在说你是如何发现/抓取你的元素的。

如果你这样做了......

...返回的元素是什么?

示例:

对于您的网站 - 可以肯定。浏览网站表单元素,而不是 Internet Explorer 元素

$url = 'https://pwpush.com'

($FormElements = Invoke-WebRequest -Uri $url -SessionVariable fe)   

<#
    StatusCode        : 200
    StatusDescription : OK
    Content           : <!DOCTYPE html>
                        <html>
...
#>



($Form = $FormElements.Forms[0]) | 
Format-List -Force

<#
    Id     : new_password
    Method : post
    Action : /p
    Fields : ...}
#>

$Form | 
Get-Member

<#
       TypeName: Microsoft.PowerShell.Commands.FormObject

    Name        MemberType   Definition                                                        
    ----        ----------   ----------                                                        
    Equals      Method       bool Equals(System.Object obj)                                    
    GetHashCode Method       int GetHashCode()                                                 
    GetType     Method       type GetType()                                                    
    ToString    Method       string ToString()                                                 
    Action      Property     string Action {get;}                                              
    Fields      Property     System.Collections.Generic.Dictionary[string,string] Fields {get;}
    Id          Property     string Id {get;}                                                  
    Method      Property     string Method {get;}                                              
    MSDN        ScriptMethod System.Object MSDN();
#>

$Form.Fields

<#
    Key                          Value                                                                                   
    ---                          -----                                                                                   
    utf8                         ✓                                                                                       
    authenticity_token           2mebmGbAJsseDW+/TeTBXAelq1s8kH5Zgb6W14Pxtba6CyWsAM4SfVqdJWdVmu5HjxIGUCWjEGhy6fLTB38UhA==
    password_payload             Enter the Password to be Shared                                                         
    password_expire_after_days   7                                                                                       
    password_expire_after_views  5                                                                                       
    password_deletable_by_viewer on                                                                                      
    commit                       Push it!  

或者只是在页面上查看网站源代码

<# 
    <span class='note'>
    (whichever comes first)
    </span>
...
#>


# so you end up here

Clear-Host

$password = '1234'
$loginUrl = 'https://pwpush.com'

$ie = New-Object -com internetexplorer.application
$ie.visible = $true
$ie.navigate($loginUrl)

while ($ie.Busy -eq $true) { Start-Sleep -Seconds 1 }

($ie.document.getElementById('password_payload') | select -first 1).value = $password
Start-Sleep -Seconds 1 

$ie.Document.getElementsByName('commit').Item().Click();
Start-Sleep -Seonds 1 

您还可以进行字符串匹配以查找要处理的元素。例如在这个多文档页面网站上

$url = 'https://www.aircanada.com/ca/en/ado/profile/sign-in.html'

# Get form elements
($FormElements = Invoke-WebRequest -Uri $url -SessionVariable fe)  

# List all form objects 
$FormElements.Forms
$FormElements.InputFields
$FormElements.ParsedHtml
$FormElements.Content
$FormElements.Scripts


# Get all page source elements
$FormElements.AllElements

$FormElements.AllElements | 
Select-Object -Expand OuterText

$FormElements.AllElements | 
Select-Object -Expand InnerText


# Get elements by string match
$FormElements.AllElements | 
Where{$_.TagName -eq "input"}

# Get all page button elements
$FormElements.AllElements | 
Where{$_.TagName -eq "Button"}

$FormElements.AllElements | 
Where{$_.TagName -eq "Button"} | 
Select-Object outerHTML

$FormElements.AllElements | 
Where{$_.TagName -eq "Button"} | 
Select-Object -Expand OuterText

$FormElements.AllElements | 
Where{$_.TagName -eq "Button"} | 
Select-Object -Expand InnerText


# Get only the submit button that matches the criteria
($FormElements.AllElements | 
Where{$_.TagName -eq "Button"} | 
Select-Object -Property outerHTML) -Match 'SIGN IN'

$FormElements.AllElements | 
Where{$_.TagName -eq "Button"} | 
Select-Object -Property * | 
Where innerText -eq 'SIGN IN'

根据您的 BookinAgent 评论更新

$FormElements.Forms
$FormElements.InputFields.FindById('bookingAgent')
<#
# Results

Id           Method Action                              Fields                                                                                
--           ------ ------                              ------                                                                                
             get    /ca/en/ado/home/search-results.html {[searchbox_01, ]}                                                                    
             get    /ca/en/ado/home/search-results.html {[searchbox_011, ]}                                                                   
             get    /ca/en/ado/home/search-results.html {[searchbox_0111, ]}                                                                  
adoLoginForm post                                       {[agencyIATA, ], [agencyID, ], [bookingAgent, ], [password, ], [rememberAgencyInfo, ]}
adoLoginForm post                                       {[agencyIATA, ], [agencyID, ], [bookingAgent, ], [password, ], [rememberAgencyInfo, ]}
bookingAgent   
#>



# Get elements by string match
$FormElements.AllElements | 
Where{$_.TagName -eq "input"} | 
Select-String -Pattern 'BookingAgent'



# Get all page button elements
$FormElements.AllElements | 
Where{$_.TagName -eq "Button"} | 
Select-String -Pattern 'BookingAgent'

【讨论】:

  • 要查看元素,我只需右键单击用户名字段并使用 IE 选择“检查元素”。我粘贴的选择减去一些额外的 DIV 就是显示的内容。我在您的 AirCanada 示例中看到,它看起来很相似,因为 bookingAgent 字段嵌套了几个级别。让我消化一下你写的东西。谢谢!
  • postanote,在 aircanada 示例中,您将如何填充 bookingagent 字段?谢谢。
  • 那是一个输入框和一个按钮。我提供的代码已经在其中。只需过滤即可。请查看我的更新。
  • 好的,我现在可以得到这个输出:@{innerHTML=;内文=; outerHTML=;外文=;标签名=输入; onfocus=onFocusUsername(); onblur=onBlurUsername(); class=moto 用户名输入;值=用户名;名称=登录用户名}
  • 我可以使用 $ie.Document.IHTMLDocument3_getElementById 来设置它吗?
【解决方案2】:

我能够成功填充用户名和密码字段并单击按钮:

$ie.Document.IHTMLDocument3_getElementById("loginUsername").value = "admin" $ie.Document.IHTMLDocument3_getElementById("loginPassword").value = "password" $Link = $ie.Document.getElementsByTagName("input") | Where-Object {$_.type -eq 'submit'} $Link.click()

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 2010-11-29
    • 2016-05-10
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多