2016-09-12 65 views
0

我正在與Remedy 9.1 Web服務構建一些接口。它使用Forms身份驗證進行配置以獲取WSDL。我希望將其保留在該配置中,以便更強大的Web服務得到保護。帶表單身份驗證的PowerShell WebServiceProxy

我有一個解決方案的一部分,但我不知道他們可以一起工作,也許你知道一個解決方案?

這工作,如果我刪除窗體身份驗證:

function New-ObjectFromProxy { 
param($proxy, $proxyAttributeName, $typeName) 
# Locate the assembly for $proxy 
$attribute = $proxy | gm | where { $_.Name -eq $proxyAttributeName } 
$str = "`$assembly = [" + $attribute.TypeName + "].assembly" 
invoke-expression $str 
# Instantiate an AuthenticationHeaderValue object. 
$type = $assembly.getTypes() | where { $_.Name -eq $typeName } 

    return $assembly.CreateInstance($type) 
} 
$Now = get-date -Format G 
$Q = "'System Broadcast End Date' >= """ + $Now + """" 

$proxy = New-WebServiceProxy -Uri "https://mycompany-itsm.columncloud.com/arsys/WSDL/public/servername/CFG%3ABroadcast" 
$authHeader = New-ObjectFromProxy -proxy $proxy -proxyAttributeName "AuthenticationInfoValue" -typeName "AuthenticationInfo" 
$authHeader.userName = "username" 
$authHeader.password = "password" 
$proxy.AuthenticationInfoValue = $authHeader 
$Response = $proxy.GetList($Q,"","") 
$Response | format-Table Broadcast_Start_Date, Broadcast_Message 

但是,如果我移動Web服務後面的窗體身份驗證的背後,我能到WSDL如果我這樣做:

#this is the url that you want will send thae request to 
$url = "https://mycompany-itsm.columncloud.com/arsys/servlet/LoginServlet" 
#here you can set your POST params 

$parameters = "username=username&pwd=ppaasswwoorrdd&encpwd=1&ipoverride=0&initialState=-1&timezone=-28800000&goto=/arsys/WSDL/protected/servername/HPD_IncidentInterface_Create_WS" 
#creating the xmlHtpp system object    
$http_request = New-Object -ComObject Msxml2.XMLHTTP 
$http_request.open('POST', $url, $false) 
#Setting required header of the request 
$http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded") 
$http_request.setRequestHeader("Content-length", $parameters.length) 
#Assigning the params to the request 
$Resp = $http_request.send($parameters) 
echo $http_request.responseText 

我想找到一個解決方案將這些解決方案結合在一起,以使用表單認證來訪問WSDL並創建一個webServiceProxy對象。也許我的google-fu很弱,但我還沒有找到new-webserviceProxy的formsauth解決方案。

回答

0

來自POSHCODE網站的原始碼。更新到添加formsauth

基本上我不得不使用回機器來找出這是如何完成之前,它是由新的WebServiceProxy超級簡單。我啓動了一個Web請求,用表單身份驗證數據發佈並獲取對話的cookie。如果我的cookie過期了,我會去找一個新的(可能會解釋我的腰圍)。

7年前發佈他的代碼的巨大道具給Oisin Grehan。

這樣稱呼它: \新WebServiceProxy-FormsAuth.ps1 -url 「https://mycompany/WSDL/public/servername/CFG%3ABroadcast」 - 命名空間 「的MyStuff」 -cookies $ CookieJar -lurl 「https://mycompany/servlet/LoginServlet」 -postData「用戶名=用戶名& PWD = ppaasswwoorrdd & encpwd = 1 & ipoverride = 0 &的初始化狀態= -1 &時區= -28800000"

# New-WebServiceProxy-FormsAuth.ps1 (v3.0 Sep 23, 2009) 
# 
# Oisin Grehan <[email protected]> (x0n) 
# ghangas 
# 
# Usage: 
# $proxy = .\New-WebServiceProxy.ps1 [-Url] http://site/service.asmx -lurl <http://site/loginpostpage> -postData <form data url encoded> [[-SoapProtocol] <Soap | Soap12>] [-Namespace <namespace>] [-Cookies <CookieContainer>] 
# 
# to see available webmethods: 
# $proxy | gm 
# 

param($url = $(throw "need `$url"), [string]$protocol = "Soap", [string]$Namespace="", [System.Net.CookieContainer]$CookieJar, [string]$lurl, [string]$postData) 

[void][system.Reflection.Assembly]::LoadWithPartialName("system.web.services") 

trap { 
     "Error:`n`n $error"; 
     break; 
} 

#$request = [System.Net.WebRequest]::Create($url); 
$dcp = new-object system.web.services.discovery.discoveryclientprotocol 

if ($CookieJar -ne $null) { 
    If ($CookieJar.ToString() = "System.Net.CookieContainer") { 
     $dcp.CookieContainer = $CookieJar 
    } 
} 

Write-Progress "Discovery" "Searching..." 
$dcp.AllowAutoRedirect = $true 


try {[void]$dcp.DiscoverAny($url) 
} 
catch { 
$CookieJar = New-Object System.Net.CookieContainer 

$buffer = [text.encoding]::ascii.getbytes($postData) 

[net.httpWebRequest] $req = [net.webRequest]::create($lurl) 
$req.method = "POST" 
$req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" 
$req.Headers.Add("Accept-Language: en-US") 
$req.Headers.Add("Accept-Encoding: gzip,deflate") 
$req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7") 
$req.AllowAutoRedirect = $true 
$req.UserAgent = "Mozilla/4.0" 
$req.ContentType = "application/x-www-form-urlencoded" 
$req.ContentLength = $buffer.length 
$req.TimeOut = 50000 
$req.KeepAlive = $true 
$req.CookieContainer = $CookieJar 
$reqst = $req.getRequestStream() 
$reqst.write($buffer, 0, $buffer.length) 
$reqst.flush() 
$reqst.close() 
[net.httpWebResponse] $res = $req.getResponse() 
$dcp.CookieContainer = $CookieJar 
[void]$dcp.DiscoverAny($url) 
} 

$dcp.ResolveAll() 
# get service name 
foreach ($entry in $dcp.Documents.GetEnumerator()) { # needed for Dictionary 
    if ($entry.Value -is [System.Web.Services.Description.ServiceDescription]) { 
     $script:serviceName = $entry.Value.Services[0].Name 
     Write-Verbose "Service: $serviceName" 
    } 
} 

Write-Progress "WS-I Basic Profile 1.1" "Validating..." 
$ns = new-Object System.CodeDom.CodeNamespace $Namespace 

$wref = new-object System.Web.Services.Description.WebReference $dcp.Documents, $ns 
$wrefs = new-object system.web.services.description.webreferencecollection 
[void]$wrefs.Add($wref) 

$ccUnit = new-object System.CodeDom.CodeCompileUnit 
[void]$ccUnit.Namespaces.Add($ns) 

$violations = new-object system.web.Services.Description.BasicProfileViolationCollection 
$wsi11 = [system.web.services.WsiProfiles]::BasicProfile1_1 

if ([system.web.Services.Description.WebServicesInteroperability]::CheckConformance($wsi11, $wref, $violations)) { 
    Write-Progress "Proxy Generation" "Compiling..." 

    $webRefOpts = new-object System.Web.Services.Description.WebReferenceOptions 
     $webRefOpts.CodeGenerationOptions = "GenerateNewAsync","GenerateProperties" #,"GenerateOldAsync" 

     #StringCollection strings = ServiceDescriptionImporter.GenerateWebReferences(
     #  webReferences, codeProvider, codeCompileUnit, parameters.GetWebReferenceOptions()); 

    $csprovider = new-object Microsoft.CSharp.CSharpCodeProvider 
     $warnings = [System.Web.Services.Description.ServiceDescriptionImporter]::GenerateWebReferences(
       $wrefs, $csprovider, $ccunit, $webRefOpts) 

    if ($warnings.Count -eq 0) { 
     $param = new-object system.CodeDom.Compiler.CompilerParameters 
     [void]$param.ReferencedAssemblies.Add("System.Xml.dll") 
     [void]$param.ReferencedAssemblies.Add("System.Web.Services.dll")   
     $param.GenerateInMemory = $true; 
     #$param.TempFiles = (new-object System.CodeDom.Compiler.TempFileCollection "c:\temp", $true) 
     $param.GenerateExecutable = $false; 
     #$param.OutputAssembly = "$($ns.Name)_$($sdname).dll" 
     $param.TreatWarningsAsErrors = $false; 
     $param.WarningLevel = 4; 

     # do it 
     $compileResults = $csprovider.CompileAssemblyFromDom($param, $ccUnit); 

     if ($compileResults.Errors.Count -gt 0) { 
      Write-Progress "Proxy Generation" "Failed." 
      foreach ($output in $compileResults.Output) { write-host $output } 
      foreach ($err in $compileResults.Errors) { write-warning $err }    
     } else {    
      $assembly = $compileResults.CompiledAssembly 

      if ($assembly) { 
       if ($namespace) { 
         $serviceType = $assembly.GetType($namespace + "." + $serviceName) 
       } else { 
        $serviceType = $assembly.GetType($serviceName) 
       } 
       $assembly.GetTypes() | % { Write-Verbose $_.FullName } 
      } else { 
       Write-Warning "Failed: `$assembly is null" 
           return 
      } 

      # return proxy instance 
      $proxy = new-object $serviceType.FullName 
      $proxy # dump instance to pipeline 
     } 
    } else { 
     Write-Progress "Proxy Generation" "Failed."   
     Write-Warning $warnings 
    } 
    #Write-Progress -Completed 
}