2016-09-12 25 views
0

私はRemedy 9.1 Webサービスを使用していくつかのインターフェイスを構築しています。 Forms認証を使用してWSDLに到達するように構成されています。より強力なWebサービスが保護された状態に保たれるように、その設定を維持したいと思います。フォーム認証を使用したPowerShell WebServiceProxy

私は解決策の一部を持っていますが、彼らは一緒に働くことはできませんが、おそらく解決策を知っていますか?

#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 

:私は、フォーム認証の後ろに戻ってWebサービスを移動する場合、私はこれを行う場合、私はWSDLを取得することができ、しかし

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 

:私は、フォーム認証を削除する場合

この

作品これらのソリューションを組み合わせて、フォームauthを使用してWSDLにアクセスし、webServiceProxyオブジェクトを作成するソリューションを探したいと思います。おそらく私のgoogle-fuは弱いですが、私はnew-webserviceProxyのformsauthソリューションを見つけられませんでした。

答えて

0

POSHCODEサイトのソースコード。 formsauthを追加するように更新しました

基本的に、new-WebServiceProxyで超簡単にされる前に、これがどのように行われたかを理解するためにバックマシンを使用しなければなりませんでした。フォーム認証データを投稿して会話のためのクッキーを取得するというWebリクエストを出します。私のクッキーが期限切れになると、私は新しいものを手に入れます(私のウエストラインを説明するかもしれません)。

彼のコードを7年前に出版するために、オイシングレハン(Oisin Grehan)の巨大な小道具。

このようにそれを呼び出します。 \新-たWebServiceProxy-FormsAuth.ps1 -URL "https://mycompany/WSDL/public/servername/CFG%3ABroadcast" -namespace "の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 
} 
関連する問題