Exchange your Mind

"La connaissance ne vaut que si elle est partagée" / "An effective Knowledge is a shared one"

Archive for the ‘script’ Category

Office365 – AD FS 2.0: Client Access Policy Builder

Posted by David ANDRE le juillet 2, 2012


L’équipe produit ADFS vient de publier un script PowerShell venant compléter les nouvelles fonctionnalités du HotFix Rollup 2 pour ADFS 2.0.

Ce script (qui est en fait un assistant) permet de créer des polices d’accès de manière très granulaire, comme par exemple : bloquer tout accès externe à Office365 excepté l’OWA.


Il est disponible gratuitement sur la galerie TechNet: http://gallery.technet.microsoft.com/scriptcenter/Client-Access-Policy-30be8ae2#content

Have Fun J

Posted in 4-ACTIVE DIRECTORY, Cloud, Office 365, Outils-2010, Owa-2010, Powershell, script | Leave a Comment »

Redirection IIS par Script de la racine vers le Vdir « OWA »

Posted by David PEKMEZ le décembre 21, 2011


Bonjour,

J’avais déjà fait un article à ce sujet il y a un an déjà ! http://unifiedit.wordpress.com/2010/12/04/iis-redirection-vers-owa-exchange-server-2010-2/

Le but est de rediriger les requêtes de la racine du Serveur IIS

Et voici le script Powershell qui va vous aider à configurer correctement vos serveurs Exchange

Le principe est très simple, vous avez deux paramètres à renseigner :

  • Le premier est l’URL de redirection que vous désirez utiliser exemple : https://unifiedit.wordpress.com/owa
  • Le second paramètre est l’utilisation ou non du SSL pour l’accès au téléchargement de l’OAB dans votre infrastructure, ici vous pouvez utiliser au choix :
    • http
    • https

Pour de plus amples informations sur l’utilisation du script vous pouvez utiliser le paramètre - ?

Exemple d’utilisation du script :


.\IISRedirect.ps1 -URLRedirect "https://exchsp2DCFR.intra.net/owa" -OAB HTTP

Code source

#=================================================================================
#	IISRedirect.ps1
#
#	THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
#	KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
#	IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
#	PARTICULAR PURPOSE.
#	
#	Description:  Redirect IIS to a Vdir Directory
#
#	# Script Written By: David Pekmez ( http://unifiedit.wordpress.com )
#
#	Version: 1
#	Last Updated: 08/12/2011
#
#=================================================================================


#=================================================================================
# Parameter definition
#=================================================================================

Param(
	[Parameter(Mandatory=$true, Position=0, HelpMessage="Please Enter the redirection URL",ValueFromPipeline=$true)][string] $URLRedirect,
	[Parameter(Mandatory=$true, Position=1, HelpMessage="Please Enter HTTP or HTTPS for OAB Access",ValueFromPipeline=$true)][string] $OAB
)

#=================================================================================
# OAB Access HTTP or HTTPS
#=================================================================================

if ($OAB -eq "HTTP")    {
    [string]$OABConf = ""
}    else    {
    [string]$OABConf = "Ssl"
}

#=================================================================================
# Add Exchange 2010 Powershell Snapin
#=================================================================================

if ( (Get-PSSnapin -Name Microsoft.Exchange.Management.PowerShell.E2010 -ErrorAction SilentlyContinue) -eq $null )
{
    Add-PsSnapin Microsoft.Exchange.Management.PowerShell.E2010
}

#==========================================================================
# Function that returns true if the incoming argument is a help request
#==========================================================================

function IsHelpRequest
{
param($argument)
return ($argument -eq "-?");
}

#==========================================================================
# Function Debug
#==========================================================================
function Debug([string]$data)
{
$var = $null
$var = get-variable($data) -ea SilentlyContinue

	if ($var)
	{
	write-host "DEBUG: " -foregroundcolor cyan -nonewline
	write-host $var.name "  " -nonewline
	write-host "[$var.value]"
	}
	else
	{
	write-host "DEBUG: " -foregroundcolor cyan -nonewline
	write-host "[$data]"
	}
	
}


#=======================================
# Reset IIS on the server
#=======================================
function ResetIIS
{

Write-Host "Restarting IIS Services..." -foregroundcolor Green

IISRESET

Write-Host ""
Write-Host "Redirection set to $URLRedirect and $OAB for OAB Access" -foregroundcolor green
Write-Host ""
}

#===================================================================
# Function that displays the help related to this script following
# the same format provided by get-help or <cmdletcall> -?
#===================================================================
function Usage
{

@"
NAME: IISRedirect.ps1

SYNOPSIS:
Add a redirection on IIS default web site to another Virtual directory 
Made for Exchange Server to redirect to OWA directory

SYNTAX:
IISRedirect.ps1

`t[-URLRedirect <Redirection URL>]
`t[-OAB <HTTP or HTTPS>]
`t[-?]

PARAMETERS:
-URLRedirect (Requiered)
Enter the IIS redirection URL to use

-OAB (Requiered)
Set OAB access to HTTP Or HTTPS

-?
Help on usage

-------------------------- EXAMPLE --------------------------

.\IISRedirect.ps1 -URLRedirect "https://unifiedit.intra.net/owa" -OAB HTTP

"@
}	

#=============================================================================================
# Redirection
# More information http://www.iis.net/ConfigReference/system.webServer/httpRedirect
# Note: You must be sure to set the commit parameter to apphost when you use AppCmd.exe 
# to configure these settings. This commits the configuration settings to the appropriate 
# location section in the ApplicationHost.config file
#=============================================================================================

Write-host ""
Write-host "IIS Config is starting ... " -foregroundcolor Green
Write-host ""

Set-Location "$env:windir\System32\inetsrv"

.\appcmd.exe set config "Default Web Site" -section:system.webServer/httpRedirect /exactDestination:"False" /childonly:true /enabled:"True" /destination:$URLRedirect

.\appcmd.exe set config "Default Web Site/Aspnet_Client" -section:system.webServer/httpRedirect /enabled:false /commit:apphost
.\appcmd.exe set config "Default Web Site/Autodiscover" -section:system.webServer/httpRedirect /enabled:false /commit:apphost
.\appcmd.exe set config "Default Web Site/EWS" -section:system.webServer/httpRedirect /enabled:false /commit:apphost
.\appcmd.exe set config "Default Web Site/ECP" -section:system.webServer/httpRedirect /enabled:false /commit:apphost
.\appcmd.exe set config "Default Web Site/Microsoft-Server-ActiveSync" -section:system.webServer/httpRedirect /enabled:false /commit:apphost
.\appcmd.exe set config "Default Web Site/OWA" -section:system.webServer/httpRedirect /enabled:false /commit:apphost
.\appcmd.exe set config "Default Web Site/PowerShell" -section:system.webServer/httpRedirect /enabled:false /commit:apphost
.\appcmd.exe set config "Default Web Site/OAB" -section:system.webServer/httpRedirect /enabled:false /commit:apphost
.\appcmd.exe set config "Default Web Site/Rpc" -section:system.webServer/httpRedirect /enabled:false /commit:apphost
.\appcmd.exe set config "Default Web Site/RpcWithCert" -section:system.webServer/httpRedirect /enabled:false /commit:apphost

Write-host ""
Write-host "Redirection HTTP Done .. " -foregroundcolor Green
Write-host ""

#====================================================================================
# Suppress SSL on "Default Web Site"
# More information http://www.iis.net/ConfigReference/system.webServer/security/access
# Note: You must be sure to set the commit parameter to apphost when you use AppCmd.exe 
# to configure these settings. This commits the configuration settings to the appropriate 
# location section in the ApplicationHost.config file
#====================================================================================

Set-Location "$env:windir\System32\inetsrv"

# Unlock IIS Config
.\appcmd.exe unlock config -section:system.webServer/security/access

Write-Host ""
Write-Host "IIS Unlock Security Access Done ...." -foregroundcolor green
Write-Host "Setting SSLFlags now ..." -foregroundcolor green
Write-Host ""


.\appcmd.exe set config "Default Web Site" -section:system.webServer/security/access /sslFlags:""
.\appcmd.exe set config "Default Web Site/Aspnet_Client" -section:system.webServer/security/access /sslFlags:"Ssl,Ssl128"
.\appcmd.exe set config "Default Web Site/Autodiscover" -section:system.webServer/security/access  /sslFlags:"Ssl,Ssl128"
.\appcmd.exe set config "Default Web Site/EWS" -section:system.webServer/security/access /sslFlags:"Ssl,Ssl128"
.\appcmd.exe set config "Default Web Site/ECP" -section:system.webServer/security/access /sslFlags:"Ssl,Ssl128"
.\appcmd.exe set config "Default Web Site/Microsoft-Server-ActiveSync" -section:system.webServer/security/access /sslFlags:"Ssl,Ssl128"
.\appcmd.exe set config "Default Web Site/OWA" -section:system.webServer/security/access /sslFlags:"Ssl,Ssl128"
.\appcmd.exe set config "Default Web Site/PowerShell" -section:system.webServer/security/access /sslFlags:""
# OAB conf is set to HTTP or HTTPS
.\appcmd.exe set config "Default Web Site/OAB" -section:system.webServer/security/access /sslFlags:$OABConf
.\appcmd.exe set config "Default Web Site/Rpc" -section:system.webServer/security/access /sslFlags:"Ssl"
.\appcmd.exe set config "Default Web Site/RpcWithCert" -section:system.webServer/security/access /sslFlags:"Ssl,Ssl128"

If ($OAB -eq "HTTP")
{
Write-Host ""
Write-Host "OAB Vdir is set to HTTP so all the infrastructure must be set to HTTP for OAB access" -foregroundcolor yellow
Write-Host ""
}
Else
{
Write-Host ""
Write-Host "OAB Vdir is set to HTTPS so all the infrastructure must be set to HTTPS for OAB access" -foregroundcolor yellow
Write-Host ""
}

#==================================================================================================
# Change security settings on the web.config file that lost the Authenticated User permissions
# The Web.config file will be created during the IIS Redirection setup
#==================================================================================================


# get file web.config path and set the right permissions if exists

$setupRegistryPath = Get-ItemProperty -path 'HKLM:SOFTWARE\Microsoft\ExchangeServer\v14\Setup' 
$exchangeInstallPath = $setupRegistryPath.MsiInstallPath 
$WebConfigFile = ($exchangeInstallPath)+"ClientAccess\OAB\web.config"
$FileExists = Test-Path $WebConfigFile
$ErrorActionPreference = "Stop"

# Authenticated Users Group SID = S-1-5-11
# a "*" is added before the SID because icacls needs it when using SIDs

$Group = "*S-1-5-11"
$GrantPerm = icacls $WebConfigFile /grant:R $Group':R'

# Set Permissions on Web.Config file giving Read Access to Anthenticated Users Group

If ($FileExists -eq $True)
{
$GrantPerm
Write-Host ""
Write-Host "Security Settings on Web.Config file Done " -foregroundcolor green
Write-Host ""
}
	
Else {Write-Host "The Web.config File is not present in Directory: $exchangeInstallPath" -foregroundcolor red}

#==================================================================================================
# IISReset
#==================================================================================================

ResetIIS  

Ce script est en téléchargement via le lien : IISRedirect.zip

Hope this Help !

David Pekmez

Posted in Exchange Server 2010, Outils-2010, script | Leave a Comment »

Exchange Server 2010 SP2 : Mise à jour du script d’installation des prés requis

Posted by David PEKMEZ le décembre 5, 2011


Bonjour !

Suite à l’annonce de la mise à disposition du Service Pack 2 d’Exchange Server 2010

J’ai mis à jour le script d’installation des prés requis

Concernant l’installation :

  • Soit vous ne disposez pas d’Exchange Server et vous installer les prés requis avec les options de rôles de serveur de 1 à 7
  • Soit vous avez un serveur Exchange 2010 et vous n’avez qu’à mettre à jour les fonctionnalités Windows en sélectionnant l’option 11



Vous trouverez le script en téléchargement via le lien : https://skydrive.live.com/redir.aspx?cid=deb7bf8a12d36694&resid=DEB7BF8A12D36694!413&parid=DEB7BF8A12D36694!252

Rien de plus simple !

Bonnes installations

David Pekmez

Posted in Exchange Server 2010, Powershell-2010, script | 2 Comments »

Exchange Server : Script et l’option Envoyer en tant que

Posted by David PEKMEZ le novembre 1, 2011


Bonjour,

Un petit billet pour vous faire part de mon expérience sur un projet quand j’ai voulu scripter l’ajout à personne le droit « envoyer en tant que ».

Définition des variables du post :

$MbxtoDelegate correspond à la Boîte sur laquelle vous voulez placer les droits

$DelegateToAdd correspond au délégué auquel vous voulez ajouter les droits

Tout se passait parfaitement bien en ajoutant la personne à l’aide de la commande suivante

Set-Mailbox -Identity $MbxtoDelegate -GrantSendOnBehalfTo $DelegateToAdd

Cependant mon client le m’a remonté la problématique suivante:

Cette commande ajoute sans problèmes le délégué sur la boîte mais fait disparaitre les entrées existantes !

Après quelques tests rapides il s’avère que c’est le fonctionnement de cette valeur en effet…

J’ai dû corriger mon script en récupérant l’information des entrées existantes en l’enregistrant dans une valeur, puis en ajoutant à cette valeur la nouvelle entrée que je souhaite ajouter, correspondant au nouveau délégué, ce qui donne à peu près ceci :

Déclaration des variables

$Mailbox = get-mailbox $MbxtoDelegate
$Delegate = get-mailbox $DelegatetoAdd

Récupération des entrées existantes à l’aide de la commande suivante

$GetSendOnBehalf = $Mailbox.GrantSendOnBehalfTo

Ajout du délégué à la valeur récupérée ci-dessus

$GetSendOnBehalf += $Delegate.DistinguishedName

Puis ajout des droits sur la mailbox

Set-Mailbox -Identity $Mailbox.identity -GrantSendOnBehalfTo $GetSendOnBehalf

Tout est rentré dans l’ordre ensuite !

Voilà si ce post peut aider l’un d’entre vous à gagner un peu de temps j’en serais comblé ! D’ailleurs n’hésitez pas à laisser un commentaire si c’est cas J

Powershell Rocks !

David Pekmez

Posted in Exchange Server 2010, script | Leave a Comment »

Délégations de Boîtes aux lettres Exchange Server 2010

Posted by David PEKMEZ le août 29, 2011


Bonjour,

Je vous présente un script qui pourrait vous dépanner lors de demandes de délégations sur un environnement Exchange Server 2010, lors d’une migration ou simplement en administration de vos plateformes Exchange.

Merci au passage à Thomas ANDRES et Yohan BOULLIER pour leur précieuse participation à l’élaboration de ce script !

Ce script va vous permettre de placer des permissions de délégations sur les boîtes à distance, à l’aide d’un compte ayant ces droits spécifiques pour placer des droits dans les Boîtes Exchange de vos utilisateurs

Pour plus de renseignements sur les droits nécessaires, veuillez-vous rendre sur cette page http://msdn.microsoft.com/en-us/library/bb204095(v=exchg.140).aspx

New-ManagementRoleAssignment -Name:ExchangeImpersonation -Role:ApplicationImpersonation -User:ServiceAccount


Pour vous servir de ce script, vous pouvez au choix:

  • Utiliser les paramètres powershell en entrée
  • Utiliser un fichier CSV en entrée

Les différents paramètres du script sont les suivants

  • MbxtoDelegate : Boîte à déléguer (paramètre obligatoire)
  • DelegatetoAdd : Délégué à ajouter (paramètre obligatoire)
  • InboxAccessPermissions : Droits sur la boîte de réception

Choix disponible : None, Owner, PublishingEditor, Editor, PublishingAuthor, Author, NoneditingAuthor, Reviewer, Contributor, Custom

  • CalendarAccessPermissions : Droits sur le calendrier
    • Choix disponible : None, Owner, PublishingEditor, Editor, PublishingAuthor, Author, NoneditingAuthor, Reviewer, Contributor, Custom
  • ContactAccessPermissions : Droits sur les contacts
    • Choix disponible : None, Owner, PublishingEditor, Editor, PublishingAuthor, Author, NoneditingAuthor, Reviewer, Contributor, Custom
  • GrantSendAs : Droit « Envoyer en tant que »
    • Choix disponible : $True / $False

Exemple d’utilisation sans le fichier CSV en entrée

Commande powershell

.\AddDelegates.ps1 -MbxtoDelegate DPEKMEZEXT -DelegatetoAdd TANDRESEXT -InboxAccessPermissions Editor -CalendarAccessPermissions Editor -ContactAccessPermissions Editor -GrantSendAs $False



Exemple d’utilisation avec le fichier CSV en entrée

Format du fichier CSV

MbxtoDelegate,DelegatetoAdd,InboxAccessPermissions,CalendarAccessPermissions,ContactAccessPermissions,GrantSendAs

TANDRESEXT,DPEKMEZEXT,Editor,Editor,Editor,False


Commande powershell

.\AddDelegates.ps1 -csv .\AddDelegates.csv


Resultat


#=================================================================================
#	AddDelegates.ps1
#
#	THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
#	KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
#	IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
#	PARTICULAR PURPOSE.
#
#	Description:
#
#	# Script Written By: David Pekmez ( http://unifiedit.wordpress.com )
#
#	Version: 1
#	Last Updated: 19/08/2011
#=================================================================================
#=================================================================================
# Parameter definition
#=================================================================================

Param(
	[Parameter(Mandatory=$false, Position=0, HelpMessage="Please Enter Mailbox UserName Or SMTP Address of the mailbox you want to Delegate",ValueFromPipeline=$true)][string] $MbxtoDelegate,
	[Parameter(Mandatory=$false, Position=1, HelpMessage="Please Enter Mailbox UserName Or SMTP Address of the Delegate you want to Add",ValueFromPipeline=$true)][string] $DelegatetoAdd,
	[Parameter(Mandatory=$false, HelpMessage="Please Enter Inbox Folder permissions to add to the Delegate",ValueFromPipeline=$true)][string] $InboxAccessPermissions="None",
	[Parameter(Mandatory=$false, HelpMessage="Please Enter Calendar Folder permissions to add to the Delegate",ValueFromPipeline=$true)][string] $CalendarAccessPermissions="None",
	[Parameter(Mandatory=$false, HelpMessage="Please Enter Contact Folder permissions to add to the Delegate",ValueFromPipeline=$true)][string] $ContactAccessPermissions="None",
	[Parameter(Mandatory=$false, HelpMessage="Grant the 'SendAs permission to Delegate",ValueFromPipeline=$true)][boolean] $GrantSendAs=$false,
	[Parameter(Mandatory=$false, HelpMessage="CSV Input file",ValueFromPipeline=$true)][string]$csv="none"
)

#==========================================================================
# Function that returns true if the incoming argument is a help request
#==========================================================================
function IsHelpRequest
{
	param($argument)
	return ($argument -eq "-?" -or $argument -eq "-help");
}

#==========================================================================
# Function that returns true if the incoming argument is a help request
#==========================================================================
function Debug([string]$data)
{
$var = $null
$var = get-variable($data) -ea SilentlyContinue

	if ($var)
	{
	write-host "DEBUG: " -foregroundcolor cyan -nonewline
	write-host $var.name "  " -nonewline
	write-host "[$var.value]"
	}
	else
	{
	write-host "DEBUG: " -foregroundcolor cyan -nonewline
	write-host "[$data]"
	}

}

#==========================================================================
# Wait until Key press
#==========================================================================
function Pause ($Message="Press any key to continue...")
{
Write-Host -NoNewLine $Message
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Write-Host ""
}
#===================================================================
# Function that displays the help related to this script following
# the same format provided by get-help or <cmdletcall> -?
#===================================================================
function Usage
{

@"
NAME: AddDelegates.ps1

SYNOPSIS:
AddDelegates to a Mailbox

SYNTAX:
AddDelegates.ps1

`t[-MbxtoDelegate <Mailbox UserName Or SMTP Address>]
`t[-DelegatetoAdd <Mailbox UserName Or SMTP Address>]
`t[-InboxAccessPermissions <Inbox Access Right>]
`t[-CalendarAccessPermissions <Calendar Access Right>]
`t[-ContactAccessPermissions <Contact Access Right>]
`t[-GrantSendAs <True/False>]
`t[-CSV <CSV file path>]

PARAMETERS:
-MbxtoDelegate (Requiered)
Mailbox UserName Or SMTP Address of the mailbox you want to Delegate

-DelegatetoAdd (Requiered)
Mailbox UserName Or SMTP Address of the Delegate you want to Add

-InboxAccessPermissions (Optionnal)
Inbox Folder permissions to add to the Delegate

-CalendarAccessPermissions (Optionnal)
Calendar Folder permissions to add to the Delegate

-ContactAccessPermissions (Optionnal)
Contact Folder permissions to add to the Delegate

-GrantSendAS (Optionnal)
Determine if the delegate must have the SendAs permission on the mailbox

-csv (Optionnal)
Specify a CSV file which contains one delegate per line

	CSV header file:
	MbxtoDelegate,DelegatetoAdd,InboxAccessPermissions,CalendarAccessPermissions,ContactAccessPermissions,GrantSendAs

-------------------------- EXAMPLE --------------------------

.\AddDelegates.ps1 -MbxtoDelegate dpekmez -DelegatetoAdd JohnDoe -InboxAccessPermissions Reviewer -CalendarAccessPermissions Editor -ContactAccessPermissions
.\AddDelegates.ps1 -csv input.csv
Mailbox folder and Calendar folder permission levels available : None, Owner, PublishingEditor, Editor, PublishingAuthor, Author, NoneditingAuthor, Reviewer, Contributor, Custom

For more information of permission level, you might want to have a look on the MDSN web Site

http://msdn.microsoft.com/en-us/library/bb856574(v=exchg.140).aspx

"@
}

#=======================================
# Check for Usage Statement Request
#=======================================
$args | foreach { if (IsHelpRequest $_) { Usage; exit; } }

#=================================================================================
# Exchange WebServices
#=================================================================================
$dllpath = "C:\Program Files\Microsoft\Exchange\Web Services\1.1\Microsoft.Exchange.WebServices.dll"
[void][Reflection.Assembly]::LoadFile($dllpath)

$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010)

$windowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$sidbind = "LDAP://<SID=" + $windowsIdentity.user.Value.ToString() + ">"
$aceuser = [ADSI]$sidbind

$service.AutodiscoverUrl($aceuser.mail.ToString())

#=================================================================================
# Get Current Domain
#=================================================================================

$domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()

#=================================================================================
# Main
#=================================================================================
function AddDelegate ([string] $MbxtoDelegate,[string] $DelegatetoAdd,[string] $InboxAccessPermissions,[string] $CalendarAccessPermissions,[string] $ContactAccessPermissions,[boolean] $GrantSendAs)
{
	#Connexion aux boites
	$Mailbox = $null;$Mailbox = get-mailbox $MbxtoDelegate -resultsize unlimited -ea stop
	$Delegate= $null;$Delegate = get-mailbox $DelegatetoAdd -resultsize unlimited -ea stop

	#initialisation des objets Web Services
	$service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $Mailbox.primarySMTPAddress.tostring());
	$mbMailbox=$null ; $mbMailbox = new-object Microsoft.Exchange.WebServices.Data.Mailbox($Mailbox.primarySMTPAddress.tostring())
	$dgUser=$null ; $dgUser = new-object Microsoft.Exchange.WebServices.Data.DelegateUser($Delegate.primarySMTPAddress.tostring())
	$dgUser.ViewPrivateItems = $false
	$dgUser.ReceiveCopiesOfMeetingMessages = $false
	$dgUser.Permissions.InboxFolderPermissionLevel = [Microsoft.Exchange.WebServices.Data.DelegateFolderPermissionLevel]::$InboxAccessPermissions
	$dgUser.Permissions.CalendarFolderPermissionLevel = [Microsoft.Exchange.WebServices.Data.DelegateFolderPermissionLevel]::$CalendarAccessPermissions
	$dgUser.Permissions.ContactsFolderPermissionLevel = [Microsoft.Exchange.WebServices.Data.DelegateFolderPermissionLevel]::$ContactAccessPermissions
	$dgArray = new-object Microsoft.Exchange.WebServices.Data.DelegateUser[] 1
	$dgArray[0] = $dgUser
	$Delegate_list = $service.GetDelegates($mbMailbox, $true)
	write-host ""

	# Permissions

	$Permissions = (get-MailboxFolderPermission $MbxtoDelegate) | where-object {$_.User.tostring() -eq $Delegate.DisplayName}

	if($Permissions -eq $null){

	Write-host -ForegroundColor Green "Mailbox Folder Permissions not found ..."
	Write-host -ForegroundColor Green "Set permissions for: " -nonewline
	Write-host $Delegate.DisplayName -foregroundcolor  cyan
	Add-MailboxFolderPermission -Identity $MbxtoDelegate -User $DelegatetoAdd -AccessRights $InboxAccessPermissions
    }

	elseif ($Permissions.AccessRights -eq $InboxAccessPermissions )
	{
	Write-host -ForegroundColor Green "Mailbox Folder Permissions already set for: " -nonewline
	Write-host $Delegate.DisplayName -foregroundcolor  cyan
	Write-host -ForegroundColor Green "Access Permissions: " -nonewline
	Write-host $InboxAccessPermissions -foregroundcolor  cyan
	Write-host -ForegroundColor Green "Update sub folders permissions now ..."

	}

	else {

 	Write-host -ForegroundColor Green "Mailbox Folder Permissions Different from : " -nonewline
 	Write-host $InboxAccessPermissions -foregroundcolor  cyan
	Write-host -ForegroundColor Green "for User: " -nonewline
 	Write-host $Delegate.DisplayName -foregroundcolor  cyan
	Write-host -ForegroundColor Green "Updating to Permissions : " -nonewline
	Write-host $InboxAccessPermissions  -foregroundcolor  cyan
	Remove-MailboxFolderPermission -Identity $MbxtoDelegate -User $DelegatetoAdd -confirm:$False
 	Add-MailboxFolderPermission -Identity $MbxtoDelegate -User $DelegatetoAdd -AccessRights $InboxAccessPermissions
 	Write-host -ForegroundColor Green "Update sub folders permissions now ..."
}

	# Delegation

	[boolean]$IsAlreadyDelegate = $false
	ForEach($Response in $Delegate_list.DelegateUserResponses)
	{
	$userid = $response.DelegateUser.UserId
	if ($Delegate.primarySMTPAddress.tostring() -eq $userid.PrimarySMTPAddress.tostring()){$IsAlreadyDelegate = $true;break}
	}
	if (!($IsAlreadyDelegate))

	{$service.AddDelegates($mbMailbox, [Microsoft.Exchange.WebServices.Data.MeetingRequestsDeliveryScope]::DelegatesAndMe, $dgArray)
	$action = "set"
	}else{
	$service.updateDelegates($mbMailbox, [Microsoft.Exchange.WebServices.Data.MeetingRequestsDeliveryScope]::DelegatesAndMe, $dgArray)
	$action = "updated"
	}

	#Récap
	Write-Host ""
	Write-Host "Boite aux lettres  : " -nonewline
	Write-Host $Mailbox.DisplayName -foregroundcolor  cyan
	Write-Host "Utilisateur délégué: " -nonewline
	Write-Host $Delegate.DisplayName -foregroundcolor  cyan

	Write-host -ForegroundColor Green "Inbox Permissions $action to:" -NoNewLine
	Write-host -ForegroundColor Yellow " " $InboxAccessPermissions " " -NoNewLine
	Write-host -ForegroundColor Green "Calendar Permissions $action to" -NoNewLine
	Write-host -ForegroundColor Yellow " " $CalendarAccessPermissions " " -NoNewLine
	Write-host -ForegroundColor Green "Contact Permissions $action to" -NoNewLine
	Write-host -ForegroundColor Yellow " " $ContactAccessPermissions

	# 'Send-AS' Permissions

	$SendAs = $false
	$Mailbox_permissions = get-adpermission $mailbox.identity  -ea stop | where { $_.user.tostring() -eq ($domain.Name + "\" + $delegate.samaccountname.tolower())}
	foreach ($ADAcePresentationObject in $Mailbox_permissions){if ($ADAcePresentationObject.ExtendedRights -like "*Send*") {$SendAs = $true;break}}
	write-host  "Send-As permission: " -nonewline  -ForegroundColor Green

	if ($GrantSendAs -and !($SendAs)){
	write-host  " granted." -ForegroundColor Yellow
	Add-ADPermission $mailbox.identity -User $delegate.identity -Extendedrights "Send As"}

	if ($GrantSendAs -and $SendAs){write-host  " already set." -ForegroundColor Yellow}
	if (!($GrantSendAs) -and !($SendAs)){write-host  " not set." -ForegroundColor Yellow}

	if (!($GrantSendAs) -and $SendAs){
	write-host  " removed." -ForegroundColor Yellow
	remove-ADPermission $mailbox.identity -User $delegate.identity -Extendedrights "Send As" -confirm:$false}

}

#=================================================================================
#MAIN
#=================================================================================

if ($csv -eq "none"){AddDelegate $MbxtoDelegate $DelegatetoAdd $InboxAccessPermissions $CalendarAccessPermissions $ContactAccessPermissions $GrantSendAs}
else{
	$curdir =(get-location).path
	if (!(test-path $csv)){$csv=$curdir+"\"+$csv}
	if (!(test-path $csv)){write-host "Impossible de trouver le fichier CSV:" -backgroundcolor red -nonewline ;write-host "'$csv'" -foregroundcolor cyan;write-host "";exit}
	$csvdata = import-csv $csv
	$csvdata | %{
	[Boolean]$sa = $False;$sa = [System.Convert]::ToBoolean($_.GrantSendAs.tostring())
	AddDelegate $_.MbxtoDelegate $_.DelegatetoAdd $_.InboxAccessPermissions $_.CalendarAccessPermissions $_.ContactAccessPermissions $sa}
	}

#=================================================================================
#Gestion des erreurs
#=================================================================================
trap
{
write-host ""

	if ( $_.FullyQualifiedErrorID.tostring().contains("GetMailbox"))
	{
		if ($_.Exception.Message.tostring().contains("introuvable"))
		{
		write-host "Impossible de trouver la boite aux lettres:" -backgroundcolor red -nonewline
		[int]$io1 = $_.Exception.Message.tostring().indexof("'",43)
		[int]$io2 = $_.Exception.Message.tostring().indexof("'",$io1+1)
		$bal = $_.Exception.Message.tostring().substring($io1+1,$io2-$io1-1)
		write-host " " $bal -foregroundcolor cyan
		write-host ""
		exit
		}
	}

	if ($_.Exception.Message.tostring().contains("DelegateFolderPermissionLevel"))
	{
		write-host "Permission incorrecte pour le dossier:" -backgroundcolor red -nonewline
		[int]$io1= $_.Exception.Message.tostring().indexof("«")
		[int]$io2= $_.Exception.Message.tostring().indexof("»")
		$folder = $_.Exception.Message.tostring().substring($io1+1,$io2-$io1-1)
		$folder = $folder -replace("FolderPermissionLevel","")
		write-host " " $folder -foregroundcolor cyan
		write-host ""
		write-host "Permissions prises en charge:"
		write-host ""
		write-host " - None"
		write-host " - Editor"
		write-host " - Reviewer"
		write-host " - Author"
		write-host " - Custom"
		write-host ""
		exit
	}

	if ($_.Exception.Message.tostring().contains("ToBoolean"))
	{
		write-host "Valeur incorrecte dans le ficheir CSV pour la colonne :" -backgroundcolor red -nonewline
		write-host " 'GrantSendAs'" -foregroundcolor cyan
		write-host "Valeurs autorisées : 'true' ou 'false'"
		write-host ""
		exit
	}

	write-host ""
	write-host ""
	write-host "------------------------------------------------------"
	write-host "categoryInfo: " -backgroundcolor red -nonewline
	write-host $_.categoryInfo
	write-host "Exception.GetType: " -backgroundcolor red -nonewline
	write-host $_.Exception.GetType().fullname
	write-host "FullyQualifiedErrorID: " -backgroundcolor red -nonewline
	write-host $_.FullyQualifiedErrorID
	write-host "Message: " -backgroundcolor red -nonewline
	write-host $_.Exception.Message
	write-host "------------------------------------------------------"
	exit
}


Ce script est téléchargeable via le lien suivant

https://skydrive.live.com/?cid=deb7bf8a12d36694&sc=documents&id=DEB7BF8A12D36694%21410#

Voilà, j’espère que ce script vous sera utile !

Bonne lecture

David Pekmez

Posted in Exchange Server 2010, script | Leave a Comment »

Pré requis Lync Server 2010

Posted by David PEKMEZ le août 3, 2011


Bonjour,

J’avais écrit il y a quelques temps un article pour partager avec vous un script d’installation de pré requis d’installation du produit Lync Server 2010 que j’avais codé

http://unifiedit.wordpress.com/2011/01/17/lync-server-2010-%E2%80%93-installation-des-pre-requis/

Je viens de trouver un script très complet venant d’être mis à jour qui pourrait donc vous intéresser, il est mis à jour régulièrement apparemment

http://www.ucblogs.net/blogs/exchange/archive/2011/07/25/Set_2D00_Lync2010Features.ps1-v5.0-_2D00_-automated-prereq-PowerShell-script-for-Lync-Server-2010-released.aspx

A tester en environnement de tests bien entendu !

Bonnes installations !

David Pekmez

Posted in Lync 2010, script | Leave a Comment »

Exchange Services Script

Posted by David PEKMEZ le janvier 24, 2011


Voici un script permettant de démarrer, arrêter ou redémarrer les services Exchange Server 2010 (en démarrage automatique)

Script allows you to Start, Stop or Restart Exchange Server 2010 Services (only theses in Automatic startup mode)




J’espère que ce script pourra vous faire gagner du temps !

Download the script

Source Code


#=================================================================================
# ExchangeServices.ps1
#
# THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
# KIND.
# Description: 
#
# This Script Written By: David Pekmez ( http://unifiedit.wordpress.com )
#
# Version: 1
# Last Updated: 19/01/2011
#==================================================================================

#=======================================
# Parameter definition
#=======================================
  
param([string]$Server,[string]$Services)
    
#==========================================================================
# Function that returns true if the incoming argument is a help request
#==========================================================================
function IsHelpRequest
{
 param($argument)
 return ($argument -eq "-?" -or $argument -eq "-help");
}
  
#===================================================================
# Function that displays the help related to this script
#===================================================================
function Usage
{

@"
NAME: ExchangeServices.ps1

SYNOPSIS:
Start / Stop or Restart Exchange Server 2010 Services
SYNTAX:
ExchangeServices.ps1
`t[-Server <ServerName>]
`t[-Services <Start / Stop / Restart>]
`t[-Help Or -?]

PARAMETERS:
-Server (Requiered)
The Server Name of the Exchange Server you want to Start / Stop or ReStart Exchange Services

-Services (Requiered)
Choose Start Or Stop Or ReStart

-? Or -Help (Optional)
To Show the Help Menu
-------------------------- EXAMPLE 1 --------------------------

.\ExchangeServices.ps1 -Server SRVEXCH -Services Start

-------------------------- EXAMPLE 2 --------------------------

.\ExchangeServices.ps1 -Server SRVEXCH -Services Stop

-------------------------- EXAMPLE 3 --------------------------

.\ExchangeServices.ps1 -Server SRVEXCH -Services ReStart

"@
} 

#=======================================
# Check for Usage Statement Request
#=======================================
$args | foreach { if (IsHelpRequest $_) { Usage; exit; } }
#==============================================
# Script Parameter Check
#==============================================

 $validInputs = $true
 $errorString =  ""

 if ($Server -eq "")
 {
  $validInputs = $false
  $errorString += "`nMissing Parameter: The -Server parameter is required. Please enter the Exchange Server Name."
 }

  if ($Services -eq "")
 {
  $validInputs = $false
  $errorString += "`nMissing Parameter: The -Services parameter is required. Please enter the Start / Stop Or ReStart parameter."
 }
 
 if (!$validInputs)
 {
  Write-error "$errorString"
 }

#===================================================
# Exchange Services Start / Stop Or ReStart
#===================================================

if($Services -like 'start')
{
$Service = Get-WmiObject -ComputerName $Server win32_service -filter "StartMode='Auto' and Name like '%Exchange%'"
ForEach ($ExchangeService in $Service)
 {
  if($ExchangeService.State -notlike 'Running')
   {
   Write-Host -ForegroundColor Green "Starting $ExchangeService"
   Start-Service $ExchangeService.Name
   }
  else {Write-Host "$ExchangeService is already Running."}
 }
Write-Host -ForegroundColor Green "All Exchange Services in Automatic Startup Mode are now Started"
}
elseif($Services -like 'stop')
{

$Service = Get-WmiObject -ComputerName $Server win32_service -filter "StartMode='Auto' and Name like '%Exchange%'"
ForEach ($ExchangeService in $Service)
 {
   
  if($ExchangeService.State -notlike 'Stopped')
   {
   Write-Host -ForegroundColor Green "Stopping $ExchangeService"
   Stop-Service $ExchangeService.Name -Force
   }
  else {Write-Host "$ExchangeService is already Stopped."} 
 }
Write-Host -ForegroundColor Green "All Exchange Services in Automatic Startup Mode are now Stopped"
}
 
elseif($Services -like 'restart')
{

 $Service = Get-WmiObject -ComputerName $Server win32_service -filter "StartMode='Auto' and Name like '%Exchange%'"
  
 ForEach ($ExchangeService in $Service)
  {
  Write-Host -ForegroundColor Green "Restarting $ExchangeService"
  ReStart-Service $ExchangeService.Name -Force
  }

  Write-Host -ForegroundColor Green "All Exchange Services in Automatic Startup Mode are now Restarted"
}
else
{
  Write-Host -ForegroundColor Green "'$Services' is an invalid command. Please choose Start Or Stop Or Restart Command."
  Write-Host -ForegroundColor Green "Get Help running -? Or -Help Switch."
}

David

Posted in Exchange Server 2010, script | Leave a Comment »

Lync Server 2010 – Installation des pré requis

Posted by David PEKMEZ le janvier 17, 2011


Histoire de gagner un peu de temps lors des installations de Lync Server 2010, un petit script permettant d’installer les prés requis pendant que vous buvez votre café le matin !

http://cid-deb7bf8a12d36694.office.live.com/self.aspx/Public/LYNC-PreRequisites.zip


Bonnes installations

David

Posted in Lync 2010, script | 2 Comments »

Exchange Server 2010 SP1 et les archives

Posted by David PEKMEZ le juillet 29, 2010


Bonjour,

Je vous présentais les archives avec Exchange Server 2010 dans un post précédent sur ce site il y a quelques temps,

La version SP1 du produit apporte son lot de nouveauté donc des modifications concernant l’archivage.

La grande nouveauté concernant les archives est qu’il est maintenant possible de stocker les archives dans des bases de données dédiées, séparées des bases de données de boîtes aux lettres.

L’intérêt que vous pourrez y trouver est par exemple une gestion différente des copies au sein d’un DAG ou tout simplement utiliser un sous-système disque de coût moindre par rapport aux bases de données de boîtes aux lettres.

Il est toujours possible bien entendu d’activer la création de l’archive en faisant un clic droit sur un utilisateur et sélectionner « Enable Archive »


Je peux ensuite choisir la destination, soit automatiquement, soit en spécifiant une base de données ou encore, notez qu’il est possible de stocker ses archives via Microsoft Online Services


Avec l’arrivée du SP1 d’Exchange Server 2010, beaucoup d’entre vous vont vouloir déplacer toutes les archives vers une base de données spécifique ou le faire par utilisateurs.

J’ai donc créé un petit script pour un client que je vous partage et qui devrait vous aider pour faciliter cette tâche

L’utilisation est assez simple, pour obtenir l’aide concernant l’usage de ce script, entrez juste - ? ou -Help


Exemple pour déplacer toutes les archives vers une base de données nommée DB2


Exemple pour déplacer l’archive d’un utilisateur en particulier


Ce script est téléchargeable ici

Vivement le SP1 J

David Pekmez

Posted in 1-EXCHANGE 2010, Powershell-2010, script | 1 Comment »

 
Suivre

Recevez les nouvelles publications par mail.

Rejoignez 225 autres abonnés