All:
I am working on a function for enabling users in Lync based off AD Group
memberships. I am interested in the best practice when attempting to have
try/catch perform an action only if there are no errors. I'll include the
entire code at the end of the email, but what I am curious about is this
specific piece:
If($Email -ne $Null)
{
try
{
Enable-CsUser $Member.Name -RegistrarPool $RegistrarPool -SipAddress
"sip:$($Email)" -ErrorAction Stop
Enable-UserSuccess
}
catch
{
Enable-UserFailed
}
}
Else
{
Enable-UserFailed -Issue Email
}
Should the Enable-UserSuccess be called outside of the try block like this?
If($Email -ne $Null)
{
try
{
Enable-CsUser $Member.Name -RegistrarPool $RegistrarPool -SipAddress
"sip:$($Email)" -ErrorAction Stop
}
catch
{
Enable-UserFailed
}
If(!$Error)
{
Enable-UserSuccess
}
}
Else
{
Enable-UserFailed -Issue Email
}
My logic for changing to using the If(!$Error) statement is in the first
example if my event logging fails, then the entire try block fails, so the user
would not get enabled in Lync. If the user account can be created, I want it
created. The logging is there for myself/others, but is not critical to the
success of the function. Anyway, here is the full code, in case it's necessary.
I apologize in advance for any formatting blunders. I've been reviewing the PS
Styling documentation on GitHub (for those
interested<https://github.com/PoshCode/PowerShellPracticeAndStyle/tree/master/Style%20Guide>)
and am trying to adhere to it, but still not 100% cleaned up pre-existing
scripts:
Function Enable-LyncUsers
{
Param(
# Group to parse members and enable in Lync
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]
[ValidateNotNull()]
[ValidateNotNullOrEmpty()]
$CSGroup,
# Registrar Pool to assign new Lync users
[Parameter(Mandatory=$false,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
Position=1)]
[ValidateNotNull()]
[ValidateNotNullOrEmpty()]
[string]
$RegistrarPool = "AHPFILER.aspirehealthplan.org"
)
function Write-Log {
[cmdletbinding()]
Param(
[Parameter(Mandatory=$true,
Position=0)]
[string]
$Message
)
$LogDirectory = "\\ahpmgmt\logs$\Lync\Enable_Users"
$LogFile = "$(Get-Date -UFormat "%Y.%m.%d") - Enable Lync Users.log"
If(-not (Test-Path "$LogDirectory\$($LogFile)"))
{
New-Item -Path $LogDirectory -Name $LogFile -ItemType File
}
Add-Content -Path "$($LogDirectory)\$($LogFile)" -Value "$(Get-Date) |
$Message$newLine"
}
function Enable-UserFailed {
[cmdletbinding()]
Param(
[Parameter(Mandatory=$false,
Position=0)]
[string]
$Source = "Enable Lync User",
[Parameter(Mandatory=$false,
Position=0)]
[string]
$Issue
)
If(-Not [System.Diagnostics.EventLog]::SourceExists($Source))
{
[System.Diagnostics.EventLog]::CreateEventSource($Source,'Lync
Server')
}
If($Issue -eq "Email")
{
$Event = @{
LogName = "Lync Server"
Source = $Source
EventID = 8414
EntryType = "Warning"
Message = "Failed to enable user, email not found:
$($User.GivenName) $($User.Surname)"
}
Write-EventLog @Event
}
Else
{
$Event = @{
LogName = "Lync Server"
Source = $Source
EventID = 8414
EntryType = "Error"
Message = "Failed to enable user: $($User.GivenName)
$($User.Surname)"
}
Write-EventLog @Event
}
}
function Enable-UserSuccess {
[cmdletbinding()]
Param(
[Parameter(Mandatory=$false,
Position=0)]
[string]
$Source = "Enable Lync User"
)
If(-Not [System.Diagnostics.EventLog]::SourceExists($Source))
{
[System.Diagnostics.EventLog]::CreateEventSource($Source,'Lync
Server')
}
$Event = @{
LogName = "Lync Server"
Source = $Source
EventID = 8414
EntryType = "Information"
Message = "User Enabled: $($User.GivenName) $($User.Surname)"
}
Write-EventLog @Event
}
Import-Module ActiveDirectory
Import-Module Lync
$Members = Get-ADGroupMember $CSGroup -Recursive
Foreach($Member in $Members)
{
$Account = Get-CsUser -Identity $Member.SamAccountName -ErrorAction
SilentlyContinue
If($Account.Enabled -ne $True)
{
$User = Get-ADUser $Member.SamAccountName -Properties Mail
$Email = $User.Mail
If($Email -ne $Null)
{
try
{
Enable-CsUser $Member.Name -RegistrarPool $RegistrarPool
-SipAddress "sip:$($Email)" -ErrorAction Stop
Enable-UserSuccess
Write-Log "Lync User Enabled: $($User.GivenName)
$($User.Surname)"
}
catch
{
Enable-UserFailed
Write-Log "Failed to enable user: $($User.GivenName)
$($User.Surname)"
}
}
Else
{
Enable-UserFailed -Issue Email
Write-Log "No email found for user: '$($User.GivenName)
$($User.Surname)'"
}
}
}
}
Confidentiality Notice: This is a transmission from Community Hospital of the
Monterey Peninsula. This message and any attached documents may be confidential
and contain information protected by state and federal medical privacy
statutes. They are intended only for the use of the addressee. If you are not
the intended recipient, any disclosure, copying, or distribution of this
information is strictly prohibited. If you received this transmission in error,
please accept our apologies and notify the sender. Thank you.