|
最近的开发工作客户提了一个需求,就是希望记录系统的登录时间和登出时间,经过简单的讨论之后,打算使用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"))
|
|
|