Powershell Invoke-WebRequest登录

时间:2016-11-02 13:42:16

标签: powershell login

我在使用powershell中给出的示例调用-WebRequest下面的代码时出现问题:

function UpdateChart(chart) {
            var data =  {
                        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
                        datasets: [{
                            label: '# of Votes',
                            data: [12, 19, 3, 5, 2, 3],
                            backgroundColor: [
                                'rgba(255, 99, 132, 0.2)',
                                'rgba(54, 162, 235, 0.2)',
                                'rgba(255, 206, 86, 0.2)',
                                'rgba(75, 192, 192, 0.2)',
                                'rgba(153, 102, 255, 0.2)',
                                'rgba(255, 159, 64, 0.2)'
                            ],
                            borderColor: [
                                'rgba(255,99,132,1)',
                                'rgba(54, 162, 235, 1)',
                                'rgba(255, 206, 86, 1)',
                                'rgba(75, 192, 192, 1)',
                                'rgba(153, 102, 255, 1)',
                                'rgba(255, 159, 64, 1)'
                            ],
                            borderWidth: 1
                        }]
            }
            chart.data.labels = data.labels
            chart.data.datasets = data.datasets
            chart.update()
        }

我收到错误消息“无法绑定参数'Uri'。无法将值转换为System.Uri。

我已经看了一下,虽然这个代码有不同的例子似乎对我没有用。有人可以请帮助我,我不知道这个最后部分正在做什么($ r)所有它似乎正在做的是再次调用同一页面而不是实际登录。

由于

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我认为我的解决方案也适合你。

首先,安装Fiddler。然后在fiddler运行时,手动登录网站。您应该在fiddler跟踪中看到登录请求 - 如果查看跟踪上的WebForms选项卡,您应该看到填充的用户名和密码字段。

出于某种原因,手动登录时,字段名称不同!字段名称在powerShell显示为的地方有" $" 字符 " _" 字符,例如ContentPlaceHolder $ txtUserName,而不是PowerShell显示的ContentPlaceHolder_txtUserName。

因此,我没有为powerShell声称属于表单的用户名和密码字段分配值,而是删除了这些字段,创建了Fiddler中显示的具有相同名称的新字段,然后填充了这些新字段。

此外,因为" $"在powerShell中是一个特殊的字符,你需要用`作为美元符号前缀,以防止powerShell认为你指的是变量名的开头。

见下面的代码: -

$webRequest = Invoke-WebRequest -URi "http://YourWebsite/Login.aspx" -SessionVariable SMSession 

$dbForm = $webRequest.Forms[0] 

# For some reason, the field values returned have underscores instead of $ signs! Need to delete this, then recreate
# with the correct values, using ` to allow $ to be passed without treating it as a variable.
$dbForm.fields.Remove("ContentPlaceHolder_txtUserName")
$dbForm.fields.Remove("ContentPlaceHolder_txtPassword")

$dbform.fields.Add("ContentPlaceHolder`$txtUserName", "admin")
$dbform.fields.Add("ContentPlaceHolder`$txtPassword", "Password2")

#$dbform.fields

$r = invoke-WebRequest -Uri ("http://YourWebsite/Login.aspx") -WebSession $SMSession -Method Post -Body $dbForm.Fields 

$r.RawContent

答案 1 :(得分:0)

您的脚本存在一些问题。

  1. 如果您检查$dbForm.Fields中哪些字段可用,您会看到:

    Key                     Value      
    ---                     -----      
    lsd                     AVq5lobS   
    display                            
    enable_profile_selector            
    isprivate                          
    legacy_return           0          
    profile_selector_ids               
    return_session                     
    skip_api_login                     
    signed_next                        
    trynum                  1          
    u_0_0                              
    u_0_1                              
    lgnrnd                  065033_QxW1
    lgnjs                   n          
    email                     
    pass                      
    persistent                         
    default_persistent      1    
    

    因此,您可能需要将用以下内容传递登录详细信息的行替换为:

    $dbForm.Fields["email"] = "johnsmith"
    $dbForm.Fields["pass"] = "password1"
    
  2. 不确定是否是拼写错误,但最后一行中的括号不需要在那里(删除后我可以运行脚本而没有任何错误)。

  3. 我认为脚本尝试做的是,在第一个Invoke-WebRequest时,它会检索登录页面,以便我们知道哪些字段可供我们使用(例如email和{{ 1}})。然后,下一个pass应该使用Invoke-WebRequest方法将我们输入的值发送回页面。