Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Powershell登录到WebForm_Powershell_Login_Webforms_Invoke Command - Fatal编程技术网

使用Powershell登录到WebForm

使用Powershell登录到WebForm,powershell,login,webforms,invoke-command,Powershell,Login,Webforms,Invoke Command,我已经尝试了一段时间登录到一个网站,浏览它,并下载文件的条件。我尝试过幻影,但失败得很惨 现在我正在尝试使用Powershell方法,我一直在寻找如何迈出第一步,登录表单以进入下一页 我遵循这些提示的最后一个站点是最后一个主题“登录到Web站点” 我正在尝试登录的站点: 这似乎是一个非常简单的登录表单,因此我将powershell代码设置为: #Input User and Password - Set UserAgent - Store the WebRequest $credential

我已经尝试了一段时间登录到一个网站,浏览它,并下载文件的条件。我尝试过幻影,但失败得很惨

现在我正在尝试使用Powershell方法,我一直在寻找如何迈出第一步,登录表单以进入下一页

我遵循这些提示的最后一个站点是最后一个主题“登录到Web站点”

我正在尝试登录的站点:

这似乎是一个非常简单的登录表单,因此我将powershell代码设置为:

#Input User and Password - Set UserAgent - Store the WebRequest

 $credential = Get-Credential
 $uaString   = [Microsoft.PowerShell.Commands.PSUserAgent]::FireFox
 $webRequest = Invoke-WebRequest -Uri 'http://portal.reti.acsm-agam.it/Portal/Index.aspx?m=200G&area=B2B' -SessionVariable webSession -UserAgent $uaString

#Store the form with id 'form1' into variable - Set fields of the form with the credential inputted before

 $loginForm= $webRequest.Forms | Where-Object {$_.Id -eq 'form1'}
 $loginForm.Fields.twsTemplate_Content1_twsModule_txtUser   = $credential.UserName
 $loginForm.Fields.twsTemplate_Content1_twsModule_txtPSW = $credential.GetNetworkCredential().Password

#Set New Request with new data, I change the -uri $loginform.action to the actual site because it actually set it to Index.aspx?m=200G&area=B2B which is just the last part of the actual site "http://portal.reti.acsm-agam.it/Portal/Index.aspx?m=200G&area=B2B" and it will raise an error

 $webRequest = Invoke-WebRequest -Uri $loginForm.Action -Method $loginForm.Method -Body $loginForm.Fields -WebSession $webSession -UserAgent $uaString

#Check if login has been successfuf,changed the Where-Object statment to an actual element that can be found in page that get showed after loggin in.

if ($webRequest.Links | Where-Object {$_.id -like ('*' + "twsTemplate_Header1_LogOff1_LnkLOF" + '*')}) {

    Write-Host "Login verified!"

} else {

    Write-Host 'Login unsuccessful!' -ForegroundColor Red -BackgroundColor DarkBlue

}
当然,If语句返回“Login unsuccessful”

发送请求后,登录页面中可能会涉及其他内容。 我注意到有些输入字段是隐藏的(我猜它们是一些令牌,不知道这些东西是如何工作的)和3个在后台运行的javascript,但不知道它们是做什么的,我读到它们是函数的包装器之类的)

如果有人能把这个拿下来就太好了。很长时间以来,我一直在尝试自动访问这些类型的网站。 多谢各位

编辑:2017年6月8日 嗨,我在做更多的测试。 似乎在登录后阻止我进入下一页的问题是如何传递输入字段。 实际上,乌斯金:

 $loginForm.Fields.twsTemplate_Content1_twsModule_txtUser   = $credential.UserName
 $loginForm.Fields.twsTemplate_Content1_twsModule_txtPSW = $credential.GetNetworkCredential().Password
不要工作,而是传递相同的值,就像

$loginForm.Fields['twsTemplate$Content1$twsModule$txtUser']= $credential.UserName
     $loginForm.Fields['twsTemplate$Content1$twsModule$txtPSW'] = $credential.GetNetworkCredential().Password
完成工作(请注意,包装名称或$的“$”而不是“\”,以及“'”将被视为变量。 我甚至不得不添加“twsTemplate\u Content1\u twsModule\u btnLogin Login”,这已经在页面中设置好了,但我仍然必须将“\u1”转换为“$”,并如上所述设置值

我不明白为什么这项工作,但实际上起了作用

2017年7月17日编辑
我以前应该知道,但我只是在业余时间才开始讨论programmin主题,因为它不是我的工作。那些带有“$”的字段与post方法中的一样工作,您必须传递字段的name属性,在我的情况下,这些字段是带有$。

的字段,因此,如果您有正确的登录,则使用post信息并登录。 它还带回一个会话,以便您可以继续与站点进行交互

function Login([string]$Address,[pscredential]$credential){
    if(!$credential){
        $credential = Get-Credential
    }
    $post = "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwUJNzY0OTc5NDQ5D2QWAgIDD2QWBAIBDw8WAh4HVmlzaWJsZWhkFgICAQ9kFgICAQ8PZBYCHgdvbmNsaWNrBZIBamF2YXNjcmlwdDp3aW5kb3cub3BlbignaW5mb0Nvb2tpZS5hc3B4JywnR3VpZGEnLCAnd2lkdGg9ODAwLGhlaWdodD02MDAsbGVmdD02MDAsdG9wPTEwMCwgc2Nyb2xsYmFycz15ZXMsIG1lbnViYXI9bm8sIHRvb2xiYXI9bm8sIHJlc2l6YWJsZT15ZXMnKTtkAgUPZBYCZg9kFgYCAQ9kFgJmD2QWAmYPFgIfAGhkAgMPZBYCZg9kFgRmD2QWAmYPZBYCAgEPFgIfAGhkAgEPZBYCAgEPDxYCHgRUZXh0BTVWZXJpZmljYSBkaSBhdmVyZSBpbnNlcml0byBjb3JyZXR0YW1lbnRlIGkgdHVvaSBkYXRpLmRkAgUPZBYCZg9kFgICAQ8PFgIfAgUQUmVsLiAyLjAuMDk0KDAzKWRkZP4%2BMa9cyFCJx8l%2BEYykopVYA0gwPUz3FbFyI0NAU1WC&__VIEWSTATEGENERATOR=DF200D8E&__EVENTVALIDATION=%2FwEWBAK8z%2BQMAsaPwpsGAqnL470LAq%2F5qKcIp5vlm7cytSxOzkYL2ESDraZWLoQRji0OxUOW9t%2FXBRI%3D&smRetiWeb=&twsTemplate%24Content1%24twsModule%24txtUser=$($credential.GetNetworkCredential().UserName)&twsTemplate%24Content1%24twsModule%24txtPSW=$($credential.GetNetworkCredential().Password)&twsTemplate%24Content1%24twsModule%24btnLogin=Login"
    $Information = Invoke-WebRequest -Uri $Address -Method POST -Body $Post -SessionVariable WebSession
    return $WebSession
}

login -Address "http://portal.reti.acsm-agam.it/Portal/Index.aspx?idn=0005&area=B2B"

$webResponse
而不是
$webRequest
可能是一个更好的变量名。响应的内容是什么?感谢您对变量名的建议。实际上,web请求内容与登录页面相同。就像我被重定向到同一页面,但什么都没有发生一样。这实际上返回了以下内容:标题:{}Cookies:System.Net.CookieContainer UseDefaultCredentials:False Credentials:Certificates:UserAgent:Mozilla/5.0(Windows NT;Windows NT 10.0;it)WindowsPowerShell/5.1.14393.1198代理:MaximumRedirection:-1如何知道我是否成功登录?以及在哪里找到您输入的viewstate参数?我只是下载fiddler来检查网络流量,我猜您可以从那里获得它,但我必须动态地知道它,因为像这样的登录站点大约有10个,我猜viewstate更改。是的,这是websession而不是webresponse。websession允许你保持与网站的连接,并使用-websession选项作为该用户执行更多的webrequests。如果你想查看响应,请查看$Information变量。我也从Chrome或IE开发者工具获取它……只需点击F12即可查看它们。我运行函数,但我不知道之后该怎么办…如果我使用相同的地址/方法/post/设置另一个WebRequest,但使用-Websession$Websession选项(从函数返回)当我将响应存储在变量中并执行$respone.content时,它会显示登录页面的html。由于$information变量在函数结束后死亡,因此无法重用。我进行了一些尝试,很抱歉,但是您构建的函数似乎只执行与我的脚本相同的操作,不同之处在于您提供的viewstate值是(根据chrome开发工具)我输入了相同的内容,但没有解析(它解析“/”到%2F,可能还有其他一些特殊字符)LOL如果我有一个登录名,我就可以猜出来:)(很遗憾,我不明白你之后想做什么)