Microsoft Lync 是微软统一通信平台Lync 服务器的客户端.。Lync客户端API包括了微软 Lync Model API 和 微软 Lync 扩展性 API,它默认主要面向构建Lync应用程序或者整合业务线应用程序的开发者。
最新版的Lync SDK API 位于 这里。 因为SDK是.NET开发的,可以非常方便地用Windows PowerShell访问。当SDK安装以后,你只需用 Import-Module命令把 Microsoft.Lync.Model.dll程序集作为组件导入即可:
Import-Module –Name “C:\Program Files (x86)\Microsoft Office\Office15\LyncSDK\Assemblies\Desktop\Microsoft.Lync.Model.dll”
在Lync 2010 SDK 的文档中,针对Windows PowerShell如何访问,讲述地非常详细。而这也同样适用于 Lync 2013 SDK。可以阅读这篇文章使用PowerShell脚本通过Lync Model API来访问Lync 2010 SDK。
为了有一个实际的任务来演示,我决定配置Lync客户端的状态(可用性)。通常,早上上班时,我喜欢把我的状态更改为“可用“,下午下班时更新我的状态为:”下班“(我的工作机器一般不关机)。但是经常会忘记更新状态,因此我准备用Windows PowerShell 3.0引入的计划任务在机器上配置我的Lync状态。
荔非苔注:”当机器长时间没有用户交互,或者锁屏状态,Lync会自动将状态更新为【离开】(Away),这和【下班】(Off Work)属于两个不同的状态。一般情况下,有人要在Lync上联系你,肯定会看下你的状态是不是可用,所以【离开】和【下班】没必要那么较真。“
我创建了一个PowerShell函数Publish-LyncContactInformation,可以用来配置Lync可用性,位置和状态信息。
#requires -version 2.0 function Publish-LyncContactInformation { <# .Synopsis Publish-LyncContactInformation是一个函数用来配置微软Lync客户端设置. .DESCRIPTION Publish-LyncContactInformation的目的是用来演示PowerShell怎样和Lync SDK交互。 只在Lync 2013 上测试. 先决条件: Lync 2013 SDK - http://www.microsoft.com/en-us/download/details.aspx?id=36824 .EXAMPLE Publish-LyncContactInformation -Availability Available .EXAMPLE Publish-LyncContactInformation -Availability Away .EXAMPLE Publish-LyncContactInformation -Availability "Off Work" -ActivityId off-work .EXAMPLE Publish-LyncContactInformation -PersonalNote test .EXAMPLE Publish-LyncContactInformation -Availability Available -PersonalNote ("Quote of the day: " + (Get-QOTD)) .EXAMPLE Publish-LyncContactInformation -Location Work .NOTES For more information, see the related blog post at blog.powershell.no .FUNCTIONALITY Provides a function to configure Availability, ActivityId and PersonalNote for the Microsoft Lync client. #> Param ( # Availability state as string [ValidateSet("Appear Offline","Available","Away","Busy","Do Not Disturb","Be Right Back","Off Work")] [string] $Availability, # ActivityId as string [string] $ActivityId, # String value to be configured as personal note in the Lync client [string] $PersonalNote, # String value to be configured as location in the Lync client [string] $Location ) if (-not (Get-Module -Name Microsoft.Lync.Model)) { try { Import-Module -Name (Join-Path -Path ${env:ProgramFiles(x86)} -ChildPath "Microsoft Office\Office15\LyncSDK\Assemblies\Desktop\Microsoft.Lync.Model.dll") -ErrorAction Stop } catch { Write-Warning "Microsoft.Lync.Model not available, download and install the Lync 2013 SDK http://www.microsoft.com/en-us/download/details.aspx?id=36824" break } } $Client = [Microsoft.Lync.Model.LyncClient]::GetClient() if ($Client.State -eq "SignedIn") { $Self = $Client.Self $ContactInfo = New-Object 'System.Collections.Generic.Dictionary[Microsoft.Lync.Model.PublishableContactInformationType, object]' switch ($Availability) { "Available" {$AvailabilityId = 3000} "Appear Offline" {$AvailabilityId = 18000} "Away" {$AvailabilityId = 15000} "Busy" {$AvailabilityId = 6000} "Do Not Disturb" {$AvailabilityId = 9000} "Be Right Back" {$AvailabilityId = 12000} "Off Work" {$AvailabilityId = 15500} } if ($Availability) { $ContactInfo.Add([Microsoft.Lync.Model.PublishableContactInformationType]::Availability, $AvailabilityId) } if ($ActivityId) { $ContactInfo.Add([Microsoft.Lync.Model.PublishableContactInformationType]::ActivityId, $ActivityId) } if ($PersonalNote) { $ContactInfo.Add([Microsoft.Lync.Model.PublishableContactInformationType]::PersonalNote, $PersonalNote) } if ($Location) { $ContactInfo.Add([Microsoft.Lync.Model.PublishableContactInformationType]::LocationName, $Location) } if ($ContactInfo.Count -gt 0) { $Publish = $Self.BeginPublishContactInformation($ContactInfo, $null, $null) $self.EndPublishContactInformation($Publish) } else { Write-Warning "No options supplied, no action was performed" } } else { Write-Warning "Lync is not running or signed in, no action was performed" } }
可用性参数,使用了ValidateSet 来验证该参数支持的值,同时在PowerShell ISE也支持智能提示。:
可用性由整数值提供,允许的值位于这个页面。为了方便用户识别和设置,我把整数值映射成状态描述,比如用“Available”代替“3000”这个值。
刚开始时,我一直没有找到“Off Work”状态所对应的整数值。后面多亏了 Jens Trier Rasmussen这位哥们指点迷津。更多信息可以参考这个页面。下面给出一个使用的例子:
Publish-LyncContactInformation -Availability “Off Work” -ActivityId off-work
其实还有很多可以配置的东西,大家可以参考这个页面。除了可用性和活动Id,还可以设置个人状态,位置参数,设置你的头像的URL地址。
我写的函数本身也包括了几个例子,可以通过运行:Get-Help Publish-LyncContactInformation –Examples 来查看:
在第5个例子中,通过调用一个函数,来更新个人状态。可以参考这个文档。在第5个例子运行后,我的Lync上的状态会变成这样:
使用了 Register-ScheduledJob, 我让这个函数每天早上8点,和下午4点运行一次。
当然关于如何配置计划任务,我也可以顺便演示一下:
$cred = Get-Credential Register-ScheduledJob -Name "Publish-LyncContactInformation - Available" -ScriptBlock { # 配置状态的代码 } -Trigger ( New-JobTrigger -DaysOfWeek Monday,Tuesday,Wednesday,Thursday,Friday -Weekly -At 08:00) -ScheduledJobOption (New-ScheduledJobOption -RequireNetwork) -Credential $cred Register-ScheduledJob -Name "Publish-LyncContactInformation - Off Work" -ScriptBlock { # 配置状态的代码 } -Trigger (New-JobTrigger -DaysOfWeek Monday,Tuesday,Wednesday,Thursday,Friday -Weekly -At 16:00) -ScheduledJobOption (New-ScheduledJobOption -RequireNetwork) -Credential $cred
在本文的结尾,我会提醒大家注意两个可能存在的陷阱:
#1: 当Register-ScheduledJob运行以后, 在计划任务的这个目录下 \Microsoft\Windows\PowerShell\ScheduledJobs 会有一个选项“无论用户是否登录总是运行”. 为了让我们的[Microsoft.Lync.Model.LyncClient]::GetClient() 在计划任务中正确运行, 这个选项必须设置成“只在用户登录后运行”:
我暂时还没有找到如何通过PowerShell中的PSScheduledJobs组件来配置这个选项,如果找到我会更新这篇文章。
2013-08-09更新: 可以使用ScheduledTasks 组件中的Set-ScheduledTask命令来设置上面的选项:
$principal = New-ScheduledTaskPrincipal -LogonType Interactive -UserId “$($env:USERDOMAIN)\$($env:USERNAME)” Set-ScheduledTask -TaskName “\Microsoft\Windows\PowerShell\ScheduledJobs\Publish-LyncContactInformation – Off Work” -Principal $principal Set-ScheduledTask -TaskName “\Microsoft\Windows\PowerShell\ScheduledJobs\Publish-LyncContactInformation – Available” -Principal $principal
上面的配置会让该任务“只在用户登录后运行”。
更多计划任务和计划工作的介绍,可以参考:“PowerShell 计划任务”
注意:你可以在Windows计划任务管理器中查看和管理Windows PowerShell 计划任务,但是Windows PowerShell计划工作对应的命令,却只能管理和设置那些在Windows PowerShell 中创建的计划任务。
因此,我可以这么理解吧:通过 Register-ScheduledJob来创建的计划任务都是支持通过Set-ScheduledTask命令来更新的。
#2: 运行Lync SDK的安装文件时,我遇到过下面的错误:
为了避免必须安装Visual Studio,我使用了7-Zip程序将安装文件解压,然后把MSI文件单独拎出来安装。
原文作者:Jan Egil Ring
原文链接:Automating Microsoft Lync using Windows PowerShell
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!