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