Quantcast
Channel: Exchange Server Development forum
Viewing all articles
Browse latest Browse all 7132

Exchange 2013 and Virtual Organizations

$
0
0

Hi

I made some scripts for Exchange 2013 with Virtual Organizations, but I got some bugs...

Here is my script for a new Virtual Organization (And yes, my testdomain is name "V8.local"):

param ( 
[string] $CompanyName = $(throw "### CompanyName is required ###"),
[string] $CompanyEmailDomainName = $(throw "### CompanyEmailDomainName is required ###")
)" ""#### Load Support Tools ####"
Import-Module ActiveDirectory
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010" ""#### Creating ID Number ####"
$ID = 0
$Run = 1
$NewID = 1

Get-ADOrganizationalUnit -SearchBase "ou=Hosting,dc=V8,dc=local" -SearchScope OneLevel -Filter * | where {$_.name -ne "Hosting"} | foreach {
	$CheckID = $_.Name
	$CheckID = $CheckID.split(" ")[0]
	[string]$CheckID = "{0:0000}" -f $CheckID
	[string]$NewID = "{0:0000}" -f $NewID
	if ($NewID -eq $CheckID){
		[int]$NewID = $NewID
		$NewID++
		}
	}

$ID = $NewID
[string]$ID = "{0:0000}" -f $ID"---- #### CustomerID: $ID ####"" ""#### Running input control ####"
if ($CompanyEmailDomainName -notmatch "."){"---- #### Email domain does not contain: . ####"
	break
	}" ""#### Creating Varibles ####"
$CustomerNameWithID = $ID + " " + $CompanyName"---- #### Customername with ID: $CustomerNameWithID ####"
$CompanyOrganizationalUnitPath = "ou=" + $CustomerNameWithID + ",ou=Hosting,dc=V8,dc=local"
$CompanyAddressListAllUsersName =  $ID + " All Users"
$CompanyAddressListAllResourcesName =  $ID + " All Resources"
$CompanyAddressListAllContactsName = $ID + " All Contacts"
$CompanyAddressListAllGroupsName = $ID + " All Groups"
$CompanyAddressListAllUsersDisplayName = $CompanyName + " All Users"
$CompanyAddressListAllResourcesDisplayName = $CompanyName + " All Resources"
$CompanyAddressListAllContactsDisplayName = $CompanyName + " All Contacts"
$CompanyAddressListAllGroupsDisplayName = $CompanyName + " All Groups"

$CompanyGlobalAddressListName = $ID + " GAL"
$CompanyGlobalAddressListDN = ""

$CompanyOfflineAddressbookName = $ID + " OAB"
$CompanyOfflineAddressbookNameWithSlash = "\" + $CompanyOfflineAddressbookName

$CompanyAddressbookPolicyName = $ID + " ABP"

$CompanyAcceptDomainName = $ID + " Accept Domain"

$CompanyDynamicDistributionListName = $ID + " Allusers DistributionList"
$CompanyDynamicDistributionListDisplayName = $CompanyName + " " + "Allusers"
$CompanyDynamicDistributionListSMTPAddress = $ID + "Allusers" + "@" +  $CompanyEmailDomainName
$CompanyDynamicDistributionListDN = ""
$CompanyGroupsOU = "ou=Groups,ou=" + $CustomerNameWithID + ",ou=hosting,dc=v8,dc=local"" ""#### Creating Organizational Units ####"
New-ADOrganizationalUnit -Path "ou=Hosting,dc=V8,dc=local" -Name "$CustomerNameWithID" -Confirm:$false
New-ADOrganizationalUnit -Path "$CompanyOrganizationalUnitPath" -Name "Groups" -Confirm:$false
New-ADOrganizationalUnit -Path "$CompanyOrganizationalUnitPath" -Name "Users" -Confirm:$false
New-ADOrganizationalUnit -Path "$CompanyOrganizationalUnitPath" -Name "Special Users" -Confirm:$false
New-ADOrganizationalUnit -Path "$CompanyOrganizationalUnitPath" -Name "Subcontractors" -Confirm:$false" ""#### Creating Addresslists ####"
New-AddressList -Name "$CompanyAddressListAllUsersName" -DisplayName "$CompanyAddressListAllUsersDisplayName" -Container "\" -IncludedRecipients MailboxUsers -ConditionalCustomAttribute1 $ID -Confirm:$false
New-AddressList -Name "$CompanyAddressListAllResourcesName" -DisplayName "$CompanyAddressListAllResourcesDisplayName" -Container "\" -IncludedRecipients Resources -ConditionalCustomAttribute1 $ID -Confirm:$false
New-AddressList -Name "$CompanyAddressListAllContactsName" -DisplayName "$CompanyAddressListAllContactsDisplayName" -Container "\" -IncludedRecipients MailContacts -ConditionalCustomAttribute1 $ID -Confirm:$false
New-AddressList -Name "$CompanyAddressListAllGroupsName" -DisplayName "$CompanyAddressListAllGroupsDisplayName" -Container "\" -IncludedRecipients MailGroups -ConditionalCustomAttribute1 $ID -Confirm:$false" ""#### Creating Global Addresslist ####"
New-GlobalAddressList -Name "$CompanyGlobalAddressListName" -ConditionalCustomAttribute1 $ID -Confirm:$false -IncludedRecipients AllRecipients" ""#### Creating Offline Addressbook ####"
New-OfflineAddressBook -Name "$CompanyOfflineAddressbookName" -AddressLists "$CompanyGlobalAddressListName" -Confirm:$false" ""#### Creating Addressbook Policy ####"
New-AddressBookPolicy -Name "$CompanyAddressbookPolicyName" -AddressLists "$CompanyAddressListAllUsersName","$CompanyAddressListAllContactsName","$CompanyAddressListAllGroupsName" -OfflineAddressBook "$CompanyOfflineAddressbookNameWithSlash" -GlobalAddressList "$CompanyGlobalAddressListName" -RoomList "$CompanyAddressListAllResourcesName" -Confirm:$false" ""#### Creating Accept Domain ####"
New-AcceptedDomain -Name "$CompanyAcceptDomainName" -DomainName "$CompanyEmailDomainName" -Confirm:$false" ""#### Creating Distribution List ####"
New-DynamicDistributionGroup -Name "$CompanyDynamicDistributionListName" -ConditionalCustomAttribute1 "$ID" -OrganizationalUnit "$CompanyGroupsOU" -PrimarySmtpAddress "$CompanyDynamicDistributionListSMTPAddress" -DisplayName $CompanyDynamicDistributionListDisplayName -IncludedRecipients MailboxUsers -Confirm:$false
Start-Sleep 5
Set-DynamicDistributionGroup -Identity "$CompanyDynamicDistributionListName" -CustomAttribute1 "$ID" -Confirm:$false" ""#### Updating Addresslists ####"
Get-GlobalAddressList | Update-GlobalAddressList
Get-AddressList | Update-AddressList

Here is my script for creating a user to that Virtual Organization:

param ( 
[string] $CompanyName = $(throw "### CompanyName is required ###"),
[string] $CompanyUserFirstName = $(throw "### Firstname is required ###"),
[string] $CompanyUserLastName = $(throw "### Lastname is required ###"),
[string] $CompanyUserEmailAddress = $(throw "### Email address is required ###"),
[string] $CompanyUserPasswordInput = $(throw "### Password is required ###")
)" ""#### Load Support Tools ####"
Import-Module ActiveDirectory
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010" ""#### Creating Variables ####"
$CompanyID = $CompanyName.split(" ")[0]
$CompanyAddressBookPolicyName = $CompanyID + " ABP"
$CompanyUserFullName = "$CompanyUserFirstName" + " " + $CompanyUserLastName
$CompanyUserDisplayName = $CompanyUserFullName
$CompanyUserOU = "ou=Users,ou=" + $CompanyName + ",ou=hosting,dc=v8,dc=local"
$CompanyUserPassword = ConvertTo-SecureString $CompanyUserPasswordInput -AsPlainText -Force" ""#### Check for Unique UPN ####"
$CompanyUserCheckForUniqueUPN = Get-Mailbox -Identity $CompanyUserEmailAddress -ErrorAction SilentlyContinue
if($CompanyUserCheckForUniqueUPN){"---- #### UPN not Unique ####"
	Break
	}" ""#### Securing Unique SamAccountName ####"
$CompanyUserSamAccountName = $CompanyUserEmailAddress.split("@")[0]
$CompanyUserSamAccountName = $CompanyID + $CompanyUserSamAccountName
$CompanyUserSamAccountOrginalName = $CompanyUserSamAccountName

$CheckSamAccountNameIndex = 0
$Run = 1
do{
	[string]$OldCheckSamAccountNameIndex = $OldCheckSamAccountNameIndex
	if($OldCheckSamAccountNameIndex){
		$CompanyUserSamAccountName = $CompanyUserSamAccountOrginalName
		$CompanyUserSamAccountName = $CompanyUserSamAccountName + $CheckSamAccountNameIndex
		}
	[int]$OldCheckSamAccountNameIndex = $OldCheckSamAccountNameIndex
	Get-Mailbox -Identity $CompanyUserSamAccountName -ErrorAction SilentlyContinue | foreach {
		$CheckSamAccountName = $_.SamAccountName
		}
	if($CompanyUserSamAccountName -ne $CheckSamAccountName){
		$Run = 0
		}
	$OldCheckSamAccountNameIndex = $CheckSamAccountNameIndex
	$CheckSamAccountNameIndex++
	}While($Run -eq 1)" ""#### Securing Unique DN ####"
$CompanyUserFullName = $CompanyUserFullName
$CompanyUserFullName = $CompanyID + " " + $CompanyUserFullName
$CompanyUserFullNameOrginalName = $CompanyUserFullName

$OldFullNameIndex = 0
$Run = 1
do{
	[string]$OldFullNameIndex = $OldFullNameIndex
	if($OldFullNameIndex){
		$CompanyUserFullName = $CompanyUserFullNameOrginalName
		$CompanyUserFullName = $CompanyUserFullName + $CheckFullNameIndex
		}
	[int]$OldFullNameIndex = $OldFullNameIndex
	Get-Mailbox -Identity $CompanyUserFullName -ErrorAction SilentlyContinue | foreach {
		$CheckFullName = $_.Name
		}
	if($CompanyUserFullName -ne $CheckFullName){
		$Run = 0
		}
	$OldFullNameIndex = $CheckFullNameIndex
	$CheckFullNameIndex++
	}While($Run -eq 1)" ""#### Creating Mailbox ####"
New-Mailbox -Name "$CompanyUserFullName" -DisplayName "$CompanyUserDisplayName" -AddressBookPolicy "$CompanyAddressBookPolicyName" -PrimarySmtpAddress $CompanyUserEmailAddress -UserPrincipalName $CompanyUserEmailAddress -FirstName "$CompanyUserFirstName" -LastName "$CompanyUserLastName" -OrganizationalUnit "$CompanyUserOU" -Password $CompanyUserPassword -SamAccountName "$CompanyUserSamAccountName" -Confirm:$false  | Set-Mailbox -CustomAttribute1 "$CompanyID" -EmailAddressPolicyEnabled:$false" ""#### Updating Addresslists ####"
Get-GlobalAddressList | Update-GlobalAddressList
Get-AddressList | Update-AddressList

And here is my script for a Meeting Room:

param ( 
[string] $CompanyName = $(throw "### CompanyName is required ###"),
[string] $CompanyMeetingRoomName = $(throw "### Roomname is required ###"),
[string] $CompanyMeetingRoomEmailAddress = $(throw "### Email address is required ###")
)" ""#### Load Support Tools ####"
Import-Module ActiveDirectory
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010" ""#### Creating Variables ####"
$CompanyID = $CompanyName.split(" ")[0]
$CompanyAddressBookPolicyName = $CompanyID + " ABP"
$CompanyMeetingRoomFullName = "$CompanyMeetingRoomName"
$CompanyMeetingRoomDisplayName = $CompanyMeetingRoomFullName
$CompanyMeetingRoomOU = "ou=Special Users,ou=" + $CompanyName + ",ou=hosting,dc=v8,dc=local"" ""#### Check for Unique UPN ####"
$CompanyMeetingRoomCheckForUniqueUPN = Get-Mailbox -Identity $CompanyMeetingRoomEmailAddress -ErrorAction SilentlyContinue
if($CompanyMeetingRoomCheckForUniqueUPN){"---- #### UPN not Unique ####"
	Break
	}" ""#### Securing Unique SamAccountName ####"
$CompanyMeetingRoomSamAccountName = $CompanyMeetingRoomEmailAddress.split("@")[0]
$CompanyMeetingRoomSamAccountName = $CompanyID + $CompanyMeetingRoomSamAccountName
$CompanyMeetingRoomSamAccountOrginalName = $CompanyMeetingRoomSamAccountName

$CheckSamAccountNameIndex = 0
$Run = 1
do{
	[string]$OldCheckSamAccountNameIndex = $OldCheckSamAccountNameIndex
	if($OldCheckSamAccountNameIndex){
		$CompanyMeetingRoomSamAccountName = $CompanyMeetingRoomSamAccountOrginalName
		$CompanyMeetingRoomSamAccountName = $CompanyMeetingRoomSamAccountName + $CheckSamAccountNameIndex
		}
	[int]$OldCheckSamAccountNameIndex = $OldCheckSamAccountNameIndex
	Get-Mailbox -Identity $CompanyMeetingRoomSamAccountName -ErrorAction SilentlyContinue | foreach {
		$CheckSamAccountName = $_.SamAccountName
		}
	if($CompanyMeetingRoomSamAccountName -ne $CheckSamAccountName){
		$Run = 0
		}
	$OldCheckSamAccountNameIndex = $CheckSamAccountNameIndex
	$CheckSamAccountNameIndex++
	}While($Run -eq 1)" ""#### Securing Unique DN ####"
$CompanyMeetingRoomFullName = $CompanyMeetingRoomFullName
$CompanyMeetingRoomFullName = $CompanyID + " " + $CompanyMeetingRoomFullName
$CompanyMeetingRoomFullNameOrginalName = $CompanyMeetingRoomFullName

$OldFullNameIndex = 0
$Run = 1
do{
	[string]$OldFullNameIndex = $OldFullNameIndex
	if($OldFullNameIndex){
		$CompanyMeetingRoomFullName = $CompanyMeetingRoomFullNameOrginalName
		$CompanyMeetingRoomFullName = $CompanyMeetingRoomFullName + $CheckFullNameIndex
		}
	[int]$OldFullNameIndex = $OldFullNameIndex
	Get-Mailbox -Identity $CompanyMeetingRoomFullName -ErrorAction SilentlyContinue | foreach {
		$CheckFullName = $_.Name
		}
	if($CompanyMeetingRoomFullName -ne $CheckFullName){
		$Run = 0
		}
	$OldFullNameIndex = $CheckFullNameIndex
	$CheckFullNameIndex++
	}While($Run -eq 1)" ""#### Creating Mailbox ####"
New-Mailbox -Name "$CompanyMeetingRoomFullName" -DisplayName "$CompanyMeetingRoomDisplayName" -AddressBookPolicy "$CompanyAddressBookPolicyName" -PrimarySmtpAddress $CompanyMeetingRoomEmailAddress -UserPrincipalName $CompanyMeetingRoomEmailAddress -OrganizationalUnit "$CompanyMeetingRoomOU" -Room -SamAccountName "$CompanyMeetingRoomSamAccountName" -Confirm:$false  | Set-Mailbox -CustomAttribute1 "$CompanyID" -EmailAddressPolicyEnabled:$false
Get-Mailbox -Identity "$CompanyMeetingRoomFullName" | Set-CalendarProcessing -AutomateProcessing AutoAccept -AllowConflicts:$false -EnableResponseDetails:$true -ProcessExternalMeetingMessages:$true -RemoveOldMeetingMessages:$true" ""#### Updating Addresslists ####"
Get-GlobalAddressList | Update-GlobalAddressList
Get-AddressList | Update-AddressList

The things I'm wondering:

1. Is there any reason, that my Dynamic Distribution Group shouldn't work?

2. When creating a new "Meeting" in Outlook 2013, I got a two diffrent results, when I'm in the "Appointment" pane and when I'm in the "Scheduling Assistant"

When klicking the "Rooms" button in "Appointment" pane, I got this:

This is Correct, but when using "Schedueling Assistiant" and "Add Rooms", then it some times start in "Global Address List", that is not the worst....

3. OWA, does not seem to care about the "Address Book Policy" at all:

It is showing every "Room" in any "Virtual Organization"...

Anyone know what I may be doing wrong?


Glenn Røsbekk - Exchange Consultant


Viewing all articles
Browse latest Browse all 7132

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>