PowerShell更新Lync状态的例子

使用PowerShell自动化Microsoft Lync


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也支持智能提示。:

PowerShell更新Lync状态的参数

PowerShell更新Lync状态的参数

可用性由整数值提供,允许的值位于这个页面。为了方便用户识别和设置,我把整数值映射成状态描述,比如用“Available”代替“3000”这个值。

刚开始时,我一直没有找到“Off Work”状态所对应的整数值。后面多亏了 Jens Trier Rasmussen这位哥们指点迷津。更多信息可以参考这个页面。下面给出一个使用的例子:

Publish-LyncContactInformation -Availability “Off Work” -ActivityId off-work

其实还有很多可以配置的东西,大家可以参考这个页面。除了可用性和活动Id,还可以设置个人状态,位置参数,设置你的头像的URL地址。

我写的函数本身也包括了几个例子,可以通过运行:Get-Help Publish-LyncContactInformation –Examples 来查看:

PowerShell更新Lync状态的例子

PowerShell更新Lync状态的例子

在第5个例子中,通过调用一个函数,来更新个人状态。可以参考这个文档。在第5个例子运行后,我的Lync上的状态会变成这样:

PowerShell更新Lync个人状态后

使用了 Register-ScheduledJob, 我让这个函数每天早上8点,和下午4点运行一次。

PowerShell计划任务

PowerShell计划任务

当然关于如何配置计划任务,我也可以顺便演示一下:

$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的安装文件时,我遇到过下面的错误:

Lync SDK 安装失败

Lync SDK 安装失败

为了避免必须安装Visual Studio,我使用了7-Zip程序将安装文件解压,然后把MSI文件单独拎出来安装。

原文作者:Jan Egil Ring
原文链接Automating Microsoft Lync using Windows PowerShell

本文链接: https://www.pstips.net/automating-microsoft-lync-using-windows-powershell.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注