Are you suggesting that the value of $DC is not available to the begin{} block? It should be.
I'm a little surprised that you would go to this much effort instead of just passing in a PowerShell URI. Third comment: this won't work with Exchange 2016 or Office 365. From: listsad...@lists.myitforum.com [mailto:listsad...@lists.myitforum.com] On Behalf Of Orlebeck, Geoffrey Sent: Tuesday, September 20, 2016 1:08 PM To: 'powershell@lists.myitforum.com' Subject: [powershell] Passing Parameter to a Begin Block: I'm just diving into advanced functions/cmdlets and am wondering is it supported or possible to pass a parameter into a Begin block? I'm working on a script that will dynamically discover an Exchange server one time during the Begin block, then enable mailboxes for any/all users passed through to the function. There is one parameter that I want to pass through from the user add function, but it needs to be passed to the Begin block (it is not referenced in the Process/End blocks). I'm trying to search online, but I'm not finding any relevant results. Here is the full code, thank you for any help in adavance: <# .Synopsis Adds mailbox to new AD user without requiring EMS 2010 Mgmt tools .DESCRIPTION Dynamically discovers Exchange Mailbox servers in specified domain and enables mailbox for specified users without requiring EMS tools on local endpoint .EXAMPLE #Pending Update# #> #Requires -Version 3 function Enable-UserMailbox { [CmdletBinding()] [Alias()] Param ( # AD user to enable mailbox [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] $UserID, # Primary SMTP address for user [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true)] $EmailAddress, # Domain controller for Exchange server discovery # Only referenced once in begin block [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true)] $DC, # Alias for user's new mailbox [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true)] $Alias ) Begin { $ADRoot = Get-ADRootDSE -Server $DC $SearchBase = $ADRoot.configurationNamingContext $search = new-object DirectoryServices.DirectorySearcher([ADSI]"LDAP://$SearchBase") $objectClass = "objectClass=msExchExchangeServer" $version = "versionNumber>=1937801568" $search.Filter = "(&($objectClass)($version))" $search.PageSize=1000 [void] $search.PropertiesToLoad.Add("name") [void] $search.PropertiesToLoad.Add("msexchcurrentserverroles") [void] $search.PropertiesToLoad.Add("networkaddress") $ExServers = $search.FindAll() | Foreach{ New-Object PSObject -Property @{ Name = $_.Properties.name[0] FQDN = $_.Properties.networkaddress | %{if ($_ -match "ncacn_ip_tcp") {$_.split(":")[1]}} Roles = $_.Properties.msexchcurrentserverroles[0] } } # Label Exchange server roles for selection $role = @{2 = "MB" 4 = "CAS" 16 = "UM" 32 = "HT" 64 = "ET"} $ExchSrvrs = foreach ($server in $ExServers) { $roles = ($role.keys | ?{$_ -band $server.roles} | %{$role.Get_Item($_)}) -join "," $server | select Name,FQDN, @{n="Roles";e={$roles}} } $ExSrvr = $ExchSrvrs | Where {$_.Roles -like "*MB*"} $URI = $ExSrvr[0].FQDN # Establish Exchange Server connection $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$URI/PowerShell/ -Authentication Kerberos Import-PSSession $Session -DisableNameChecking } Process { Enable-Mailbox $UserID -PrimarySMTPAddress $EmailAddress -Alias $Alias } End { # END BLOCK REQUIREMENTS STILL IN PROGRESS # # Return output confirming mailbox addition? # Remove PS Sessions? } } 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.