`
csyqbtlsz
  • 浏览: 23847 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PowerShell调用WebService

阅读更多

最近的开发工作客户提了一个需求,就是希望记录系统的登录时间和登出时间,经过简单的讨论之后,打算使用PowerShell写成脚本挂在组策略上,因此需要这个脚本实现调用制作系统的WebService,具体代码如下:

#使用PowerShell调用WebService的脚本块
#此方法有三个参数
#url(String):要调用的WebService地址
#methodName(String):要调用的WebService方法
#parameters(Object[]):调用WebService方法所需要的参数
function Call-WebserviceMethod($url,$metbodName,$parameters){
	$result = @{"ExecuteState" = $true ; "ExecuteMessage" = "" ; "ExecuteResult" = ""};
	#生成代理类的命名空间
	$namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
	#取URL的最后服务名作为类名
	$className = $url.Split(@('/'))[-1].Split(@('.'))[0];
	#创建Web客户端
	$webClient = New-Object -TypeName System.Net.WebClient;
	#读取WSDL
	$stream = $webClient.OpenRead($url + "?WSDL");
	#创建WebService描述
	$serviceDescription = [System.Web.Services.Description.ServiceDescription]::Read($stream);
	#生成代理容器
	$serviceDescriptionImporter = New-Object -TypeName System.Web.Services.Description.ServiceDescriptionImporter;
	#添加描述
	$serviceDescriptionImporter.AddServiceDescription($serviceDescription, "", "");
	#生成命名空间
	$codeNameSpace = New-Object -TypeName System.CodeDom.CodeNamespace -ArgumentList $namespace;
	#生成客户端
	$codeCompileUnit = New-Object -TypeName System.CodeDom.CodeCompileUnit;
	$codeCompileUnit.Namespaces.Add($codeNameSpace);
	$serviceDescriptionImporter.Import($codeNameSpace, $codeCompileUnit);
	$cSharpCodeProvider = New-Object -TypeName Microsoft.CSharp.CSharpCodeProvider;
	#设定编译参数   
	$compilerParameters = New-Object -TypeName System.CodeDom.Compiler.CompilerParameters;
	$compilerParameters.GenerateExecutable = $false;
	$compilerParameters.GenerateInMemory = $true;
	$compilerParameters.ReferencedAssemblies.Add("System.dll");
	$compilerParameters.ReferencedAssemblies.Add("System.XML.dll");
	$compilerParameters.ReferencedAssemblies.Add("System.Web.Services.dll");
	$compilerParameters.ReferencedAssemblies.Add("System.Data.dll");
	#编译代理类
	$compilerResults = $cSharpCodeProvider.CompileAssemblyFromDom($compilerParameters,$codeCompileUnit);
	if($compilerResults.Errors.HasErrors -eq $false)
	{
		$assembly = $compilerResults.CompiledAssembly;
		$proxyType =  $assembly.GetType($namespace + "." + $className, $true, $true);
		$proxyObject = [System.Activator]::CreateInstance($proxyType);
		$proxyMethod = $proxyType.GetMethod($metbodName);
		$result["ExecuteResult"] = $proxyMethod.Invoke($proxyObject,$parameters);
		$result["ExecuteMessage"] = "执行WebService方法成功";
	}
	else
	{
		$result["ExecuteState"] = $false;
		$result["ExecuteMessage"] = "执行WebService方法失败,编译代理类时发生错误";
	}
	return $result;
}

#调用测试
Call-WebserviceMethod "http://localhost:44596/WebClient/Service.asmx" "SayHello" (@("zhangsan"))
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics