Enough is enough
Stingray Traffic Manager Solution Guide – Microsoft Exchange 2010
Don’t Ask!
PortQry ALL Domain Controllers using #Powershell
Get a List of InSite DCs from Eventlog
Long boot times may be observed with Data ONTAP DSM 3.5
#NetApp Data ONTAP DSM for Windows MPIO 4.0
BlackBerry Enterprise Server Interim Security Update for February 12,2013
PowerShell ASP: Get-TransportQueue.ps1x [Update]
NetApp sdcli disk list to CSV with Powershell
Powershell: Import CSV files to Excel
#Powershell
So Ari asked if I could knock up a script that would import csv files in to Excel .. and here it is. It uses the Excel object model, so excel and powershell need to be on the box you this from
Basically copy the csv files you want to your “rootfolder” of choice and run the script. It uses the filename for the tab name.
$filename = “$RootFolder\ExcelSpreadsheet.xls”
$files = dir -Path $RootFolder *.csv
$excel = new-object -comobject Excel.Application
$excel.visible = $true
$workbook = $excel.workbooks.add()
$sheets = $workbook.sheets
$sheetCount = $Sheets.Count
$mySheet = 1
$mySheetName = “Sheet” + $mySheet
$s1 = $sheets | where {$_.name -eq $mySheetName }
$s1.Activate()
If($sheetCount -gt 1){
#Delete other Sheets
$Sheets | ForEach{
$tmpSheetName = $_.Name
$tmpSheet = $_
If($tmpSheetName -ne “Sheet1″){$tmpSheet.Delete()}
}
}
ForEach($file in $files){
If($mySheet -gt 1){$s1 = $workbook.sheets.add()}
$s1.Name = $file.BaseName
$s1.Activate()
$s1Data = Import-Csv $file.FullName
$s1data | ConvertTo-Csv -Delimiter “`t” -NoTypeInformation | Clip
$s1.cells.item(1,1).Select()
$s1.Paste()
$mySheet ++
}
$workbook.SaveAs($FileName)
$excel.Quit()
Let me know what you think
#PowerShell Flip-Array Function
# UPDATE # The more I played around, it noticed an undocumented feature
where the Property value from Get-Member could be a NoteProperty .. so updated the function to reflect this.
So I use Windows Powershell every day, and I have quite a few scripts that use ConvertTo-Html
Now this is cool, except when the array I want has a lot of properties which in turn generates lots of columns.
I knocked this up this morning to kinda get around that. Essentially the function takes an array and a key as input and flips the array.
so ..
Name Site ServerRole Edition AdminDisplayVersion
—- —- ———- ——- ——————-
MSX flaphead.local/Co… Mailbox,… Standard Version 8.2 (Bui…
turns in to
Property MSX
——– —
AdminDisplayVersion Version 8.2 (Build 176.2)
CurrentConfigDomainController
CurrentDomainControllers {}
CurrentGlobalCatalogs {}
CustomerFeedbackEnabled
DataPath C:\Program Files\Microsoft\Exchange…
DistinguishedName CN=MSX,CN=Servers,CN=Exchange…
Domain flaphead.local
Enjoy
function Flip-Array{Param($Array, $key)
$matrix =@()
$KeyValue = @()
$Array | ForEach{$KeyValue += $_.$key}
$cols = @(); $cols += "Property" ; $cols += $keyValue
$rows = @(); $array | Get-Member | Where {$_.MemberType –like "*Property"} | ForEach{$Rows += $_.Name}
$rows | ForEach{
$tmpMatrix = "" | Select $cols
$tmpMatrix.Property = $_
$Matrix += $tmpMatrix
}
ForEach($item in $Array){
$ItemKey = $item.$key
ForEach($Row in $Rows){
($Matrix | Where {$_.Property -eq $row}).$ItemKey = $Item.$Row
}
}
Return $Matrix
}
$msx = Get-ExchangeServer
$y=Flip-Array -Key Name -Array $msx
First day with my Microsoft Surface
#MicrosoftSurface
So I was lucky enough to have my Microsoft Surface RT turn up on Monday. I was like a child a Christmas when I opened the box!
Tuesday was my first full day with it and I like it. The Windows 8 Metro interface takes a bit of getting used to, as does the lack of being able to install “normal” applications but that is fine.
What is a shame is that it doesn’t come with a pen as it would make it the full package, but that will happen with the Pro version.
The touch keyboard is really strange, but amazingly usable and a great addition to the device. The way it just snaps on and folds over or behind the screen is great and with the kick stand works really well. The device is a nice weight, feels well build, but can get a bit heavy when you hold it for a period of time I one hand. What would be nice is a popup on the screen when you click on shift or CAPS. The number of times writing this I thought I pressed shift but didn’t. I suppose I am used to my iPad that “holds” shift down for the next key you type.
The screen is beautiful even with high quality pictures and video. It is also a magnet for finger prints and quite reflective. While watching a video on the train, I could see a reflection of my ugly mug in in the screen! As far as video is concerned, I wish it could place MKV files out of the box, but it can’t, and I am unable to find an app in the App Store yet. On the App Store it really needs a search button and to get some more apps, but I suppose that will come. It is the lack of apps that will force me to keep my iPad on me for the moment!
As you would expect I have had a few issues. The Evernote metro app crashes a lot, I have had some issue playing music on a very old micro sd card, but that could be the card, as I had similar issues video playback. I have a new micro sd on order from amazon so will report back once it arrives.
All in all, the RT is very responsive, could do with built in 3 or 4G, and nice to use. Would I recommend it? With the pro version coming soon, probably not if you don’t have the cash to get it, if you do have some spare cash then god yeah.
Windows 8 is a game changer as far as computing goes. I have been using a tablet pc for a good few years now, and see the shift Microsoft is making. Some people will like it and some will not. To get the full benefit you do need touch!
My ideal device would have been the Microsoft Courier. Think of two kindle sized screens stitched together, with what looked like an excellent interface, with touch and pen. Someone could make this using Windows 8 and it would be awesome. Turn it landscape with a kick stand and one screen could be a touch screen keyboard!
I am starting to really like Windows 8. Yes it is different, but touch make things much more fun and it has to be the way forward. Lets see what the Pro version and other hardware manufactures can do with this innovative OS and Microsoft sort the App Store so I can hand my iPad down to my wife!
Exchange Server 2010 Monitoring Management Pack
#MsExchange
At long last the updated Exchange Server 2010 Monitoring Management Pack has hit the streets!
Exchange 2010 Scripting Agent
#MSExchange
So SteveM showed me this a while back, and yeah I know I am at the back of the queue, but boy is this a pain in the butt!
So I want to set some standard stuff when you run New-MailboxDatabase. Standard properties are kinda simple, but i discovered that AD Replication, even in a small environment can break the scripting agent, especially when you want to set AD Permissions on a mailbox. Powershell rocks, but it runs so fast that AD just doesn’t update quick enough!. [So when is Exchange going to break out from the AD and go back to it’s own directory like the good olde days?]
So, the resolution was to add a function that checks to see if the cmdlet value was actually set. It checks 60 times (60 seconds) then exits the loop.
So here is my current ScriptingAgentConfig.xml
<?xml version="1.0" encoding="utf-8" ?>
<Configuration version="1.0">
<!--
NAME: ScriptingAgentConfig.xml
AUTHOR: Paul Flaherty
Last Edit: v1.0 [24 July 2012]
ScriptingAgentConfig.xml uses the Exchange Server 2010 Scritpting Agent Cmdlet Extension.
It allows additional configuration to take place when certain Exchange 2010 cmdlets are executed.
Feature: NewMailboxDatabase
The portion of code runs after New-MailboxDatabase and sets a number of things:
- Removes all the database limits
- Sets deleted items and mailbox retention limits to 31 days
- Assigned Send-As, Receive-As and ms-Exch-Store-Admin rights
The Function Check-AdReplications is used to ensure the AD object changes have taken place
OUTPUT from the script is stored in C:\PS\ScriptingAgent_New-MailboxDatabase_<datetime>.txt
-->
<Feature Name="NewMailboxDatabase" Cmdlets="New-MailboxDatabase">
<ApiCall Name="OnComplete">
If ($Succeeded) {
$xNow = Get-Date -format "yyyy-MM-dd_HH_mm_ss"
$tmpOutFile = "C:\PS\ScriptingAgent_" + $provisioningHandler.TaskName + "_" + $xNow + ".txt"
$NewDatabase = $provisioningHandler.UserSpecifiedParameters["Name"]
$OriginatingDC = "abc123"
Function Check-ADReplication([String]$incmdlet){
#This functions takes an cmdlet string as a parameter and uses it to check if the result of the cmdlet
#is not NULL. However, after 60 attempts (Approx 60 seconds) the function with exit.
"Check-ADReplication" >> $tmpOutFile
$incmdlet = $incmdlet.replace("##","_.")
$incmdlet >> $tmpoutfile
#Loop round 30 times
For($i=0; $i -le 60; $i++ ){
$now = Get-Date
"Check $i" >> $tmpOutFile
$now >> $tmpOutFile
#Invoke the incoming cmdlet
$tmpExpression = Invoke-Expression $incmdlet #get-MailboxDatabase $NewDatabase -DomainController $OriginatingDC
If ($tmpExpression -eq $null){
#if the result is null, sleep for 1 second and loop
"Null" >> $tmpOutFile; Start-Sleep 1
}ELSE{
#If the result is NOT null, set the look to exit
#On first run, extect the Domain Controller for later use
"OK" >> $tmpOutFile;
IF($script:OriginatingDC -eq "abc123"){$script:OriginatingDC = $tmpExpression.originatingserver}
$i=99;
}#IF
}#For
} #Function
#Write stuff out
$now = Get-Date
$now >> $tmpOutFile
"ScriptingAgent[NewMailboxDatabase]" >> $tmpOutFile
$provisioningHandler >> $tmpOutFile
$provisioningHandler.Userscope | fl >> $tmpOutFile
$readOnlyIConfigurable >> $tmpoutfile
"Mailbox Database: $NewDatabase" >> $tmpOutFile
#Check if the database has replicated to the AD yet
$cmdlet2Check = "get-MailboxDatabase " + $NewDatabase
Check-ADReplication $cmdlet2Check
$OriginatingDC >> $tmpOutFile
#Remove database limits
"-Remove database limits" >> $tmpOutFile
Get-MailboxDatabase $NewDatabase | Set-MailboxDatabase -ProhibitSendReceiveQuota 'unlimited' -ProhibitSendQuota 'unlimited' -IssueWarningQuota 'unlimited' -RecoverableItemsQuota 'unlimited' -RecoverableItemsWarningQuota 'unlimited' -DomainController $OriginatingDC
$cmdlet2Check = "get-MailboxDatabase " + $NewDatabase + " -DomainController " + $OriginatingDC + " | Where{$##ProhibitSendReceiveQuota -eq 'unlimited'}"
Check-ADReplication $cmdlet2Check
#Set Deleted items retention
"-Set Deleted items retention" >> $tmpOutFile
Get-MailboxDatabase $NewDatabase | Set-MailboxDatabase -DeletedItemRetention 31 -MailboxRetention 31 -DomainController $OriginatingDC
$cmdlet2Check = "get-MailboxDatabase " + $NewDatabase + " -DomainController " + $OriginatingDC + " | Where{$##DeletedItemRetention -eq 31}"
Check-ADReplication $cmdlet2Check
"-Set AD Permissions" >> $tmpOutFile
$cmdlet2Check = "get-MailboxDatabase " + $NewDatabase + " -DomainController " + $OriginatingDC + " | Get-AdPermission | Where{$##User -like '*Organization Management'}"
Check-ADReplication $cmdlet2Check
#Groups Names for the permissions
$SendAs = "UG_MGT_msExchSendAs"
$ReceiveAs = "UG_MGT_msExchReceiveAs"
$StoreAdmin = "UG_MGT_msExchStoreAdmin"
#Grant the above groups the required rights
Get-MailboxDatabase $NewDatabase | Add-ADPermission -user $SendAs -AccessRights extendedright -ExtendedRight Send-As -DomainController $OriginatingDC
Get-MailboxDatabase $NewDatabase | Add-ADPermission -user $ReceiveAs -AccessRights extendedright -ExtendedRight Receive-As -DomainController $OriginatingDC
Get-MailboxDatabase $NewDatabase | Add-ADPermission -user $StoreAdmin -AccessRights extendedright -ExtendedRight ms-Exch-Store-Admin -DomainController $OriginatingDC
}
</ApiCall>
</Feature>
</Configuration>
if you want more then check these out:
- http://technet.microsoft.com/en-us/library/dd335067
- http://technet.microsoft.com/en-us/library/dd297951
- http://technet.microsoft.com/en-us/library/dd298143
- http://www.proexchange.be/blogs/exchange2010/archive/2011/08/31/using-the-scripting-agent-to-automate-some-basic-housekeeping-tasks.aspx
- http://eightwone.com/2011/08/24/automatic-archive-provisioning-with-cmdlet-extension-agents/
- http://eightwone.com/2012/06/19/postconfiguring-mailboxes-cmdlet-extension-agents-part-2/
- http://www.howexchangeworks.com/2011/06/automating-tasks-with-scripting-agent.html
- http://www.ehloworld.com/194
- http://www.mikepfeiffer.net/2011/06/implementing-custom-validation-in-the-exchange-2010-management-tools/
- http://blog.crayon.no/blogs/janegil/archive/2010/10/17/using_2D00_cmdlet_2D00_extension_2D00_agents_2D00_to_2D00_customize_2D00_mailbox_2D00_provisioning.aspx
- http://www.flobee.net/automatically-disable-activesync-for-new-mailboxes-in-exchange-2010
- http://byronwright.blogspot.co.uk/2011/08/objects-available-to-scripting-agent.html
Enjoy
Office 2013 Preview
Bugger nearly missed that, thanks Ari
Office Professional Plus 2013 Preview, Vision 2013 Preview and Project 2013 Preview all up on Technet for Subscribers
Microsoft Exchange Server 2013 Preview Help
#MSExchange
Not sure if you have found this link yet?
This download contains the Help content for the Microsoft Exchange Server 2013 Preview, Exchange Online Preview, and Exchange Server 2013 Preview Hybrid Deployments release.
http://www.microsoft.com/en-us/download/details.aspx?id=30338
BTW the download is 1.36GB and you can get it from here:
#Powershell Service Uptime
So i wanted to see how long a couple of BlackBerry servers had been up, but I wanted to know how long the services has been running. So i knocked this up. Its dead simple to change for other services!
$Servers = "BES01", "BES02"
$Matrix = @()
ForEach($Server in $Servers){
Write-Host $Server -Foregroundcolor Green
$SVC = Get-Service -ComputerName $Server | Where {$_.Name -like "Black*"}
Foreach($item in $SVC){
$tmpMatrix="" | Select Server, Service, State, Uptime
Write-Host "-" $Item.Name
$tmpMatrix.Server = $Server
$tmpMatrix.Service = $item.Name
$s = gwmi win32_service -ComputerName $Server -filter "name = ‘$($item.Name)’"
$tmpMatrix.State = $s.State
If ($s.State -eq "Running"){
$tmpUpTime = "{0}" -f ((get-date) – ([wmi]”).ConvertToDateTime((gwmi Win32_Process -ComputerName $Server -filter "ProcessID = ‘$($s.ProcessId)’").CreationDate))
$tmpMatrix.Uptime = $tmpUpTime
}
$Matrix += $tmpMatrix
}
}
$Matrix
Get-DatabaseDistribution.ps1
#msexchange #powershell
How cr@p am I? I totally forgot about this baby. So this is rough and ready
not had a chance to sort the help out at the beginning, but I’m sure you will get the idea. Basically run this with one of the switches ByMailboxSize or ByMailboxCount and it will look at your exchange 2010 mailboxes and try and load balance the users. It doesn’t actually DO anything, what it will do is generate a CSV that you use as input for Move-RequestFromCSV that is here: http://flaphead.dns2go.com/?p=2945
Let me know what you think. In the test I have done so far ByMailboxCount is shweet, ByMailboxSize isn’t perfect. Enjoy
PARAM([String]$Database="", [String]$BatchName, [Switch]$ByMailboxCount, [Switch]$ByMailboxSize, [String]$SizePercentage=2, [String]$ExportCSV="$pwd\miguserlist.csv")
#http://stackoverflow.com/questions/5863772/powershell-round-down-to-nearest-whole-number
function round( $value, [MidpointRounding]$mode = ‘AwayFromZero’ ) { [Math]::Round( $value, $mode ) }
#$DB=@();Get-MailboxDatabase * | ForEach{$db += $_.name}
$xPsCheck = Get-PSSnapin | Select Name | Where {$_.Name -Like "*Exchange*"}
If ($xPsCheck -eq $Null) {Add-PsSnapin Microsoft.Exchange.Management.PowerShell.e2010}
Write-Host "Database:……."$Database
Write-Host "ByMailboxCount:."$ByMailboxCount
Write-Host "ByMailboxSize:.."$ByMailboxSize
Write-Host "SizePercentage:."$SizePercentage
Write-Host "ExportCSV:……"$ExportCSV
Write-Host ""
If ($Database -ne ""){
$tmpDatabaseArray = $database.split(" ")
$i=0
$DatabaseHashTable = @{}
ForEach($item in $tmpDatabaseArray){; $DatabaseHashTable.Add($i,$item); $i++}
}
$tmpDatabaseArray
$MailboxArray=@()
ForEach($item in $tmpDatabaseArray){
Write-Host "`nChecking Database" $item -Foregroundcolor Green
$position=$host.ui.rawui.cursorposition
$tmpMailbox = Get-Mailbox -Database $item -ResultSize unlimited
$mbxcnt = 0
$mbxItems = 0
$mbxSize = 0
ForEach($xMailbox in $tmpMailbox){
$tmpUser = $xmailbox.PrimarySmtpAddress.toString()
$host.ui.rawui.cursorposition=$position;
Write-Host "-" $tmpuser " "
$tmpMailboxArray = "" | Select DisplayName, Email, ServerName, Database, Items, Size, Target, Status
$tmpMailboxArray.DisplayName = $xMailbox.DisplayName
$tmpMailboxArray.Email = $tmpUser
$tmpMailboxArray.ServerName = $xMailbox.ServerName
$tmpMailboxArray.Database = $xMailbox.Database
$tmpMailboxArray.Target = $xMailbox.Database
$tmpMailboxStatistics = Get-Mailbox $tmpUser | Get-MailboxStatistics
$tmpMailboxArray.Items = $tmpMailboxStatistics.ItemCount
$tmpMailboxArray.Size = $tmpMailboxStatistics.TotalItemSize.Value.ToMB()
$MailboxArray += $tmpMailboxArray
$mbxcnt ++
$mbxItems += $tmpMailboxArray.Items
$mbxSize += $tmpMailboxArray.Size
}
$host.ui.rawui.cursorposition=$position;
Write-Host "-> Complete! " -NoNewLIne
Write-Host $mbxcnt -NoNewLine -ForegroundColor Yellow
Write-Host " Mailboxes Found with " -NoNewline
Write-Host $mbxItems -NoNewLine -ForegroundColor Yellow
Write-host " Items and " -NoNewLine
Write-Host $mbxSize -ForegroundColor Yellow -NoNewLine
Write-Host "MB "
}
#Okay lets count the number of databases
$DatabaseCount = $tmpdatabasearray.count
$MailboxCount = $MailboxArray.count
$MailboxSize = ($MailboxArray | Measure-Object Size -sum).Sum
$MailboxesPerDatabase = round ($MailboxCount / $DatabaseCount )
$MBPerDatabase = round ($MailboxSize / $DatabaseCount )
Write-Host "Database Count:……………."$DatabaseCount
Write-Host "Mailbox Count:…………….."$MailboxCount
Write-Host "Ideal Mailboxes Per Database:.."$MailboxesPerDatabase
Write-Host "Total Size:……………….."$MailboxSize
Write-Host "Ideal MB Per Database:………"$MBPerDatabase
$MBPerDatabase = round ($MBPerDatabase + (($MBPerDatabase /100)*$SizePercentage))
Write-Host "`nMB Per Database (+"$SizePercentage"%) = "$MBPerDatabase
#Group MailboxArray by Database
$DatabaseCountArray = $MailboxArray | Group Database
$DatabaseMatrix = @()
ForEach($Item in $DatabaseCountArray){
$tmpDatabaseMatrix = "" | Select Name, Count, Difference1, Difference2, MB , Difference3, Difference4
$tmpDatabaseMatrix.Name = $Item.Name
$tmpDatabaseMatrix.Count = $Item.Count
$tmpDatabaseMatrix.Difference1 = $MailboxesPerDatabase – $Item.Count
$tmpDatabaseMatrix.Difference2 = $Item.Count – $MailboxesPerDatabase
$tmpDatabaseMatrix.MB = ($Item.Group | Measure-Object Size -Sum).Sum
$tmpDatabaseMatrix.Difference3 = $MBPerDatabase – $tmpDatabaseMatrix.MB
$tmpDatabaseMatrix.Difference4 = $tmpDatabaseMatrix.MB – $MBPerDatabase
$DatabaseMatrix += $tmpDatabaseMatrix
}
$DatabaseMatrix | ft
If ($ByMailboxSize){
Write-Host "`nBY MAILBOX SIZE" -Foregroundcolor Red
Write-Host "—————"
Write-Host "`nFinding databases with excess mailboxes"
$Database2MoveOff = $DatabaseMatrix | Where {$_.Difference4 -ge 0}
ForEach($db in $Database2MoveOff){
Write-Host $db.Name -Foregroundcolor Blue
$tmpExcess = $MailboxArray | where {$_.Database -eq $db.Name} | Sort Size -Descending
$targetMB=0
ForEach($yUser in $MailboxArray | where {$_.Database -eq $db.Name} | Sort Size -Descending){
$tmpMB = $yUser.Size
If ($tmpMB + $targetMB -gt $MBPerDatabase){
$yUser.Target = ""
} ELSE {
$yuser.Status = "Keep"
$targetMB += $tmpMB
} #If ($tmpMB + $targetMB -gt $MBPerDatabase)
} #ForEach $yUser
} #ForEach $db
Write-Host "`nAssigning excess mailboxes"
ForEach($item in $DatabaseMatrix | Where {$_.Difference3 -gt 0}){
$Mailboxes2Move = $DatabaseMatrix | Where {$_.Target -eq ""}
$targetMB=$item.MB
ForEach($yUser in $MailboxArray | where {$_.Target -eq ""} | Sort Size -Descending){
$tmpMB = $yUser.Size
If ($tmpMB + $targetMB -gt $MBPerDatabase){
$yUser.Target = ""
} ELSE {
$yuser.Target = $item.Name
$yuser.Status = "Move"
$targetMB += $tmpMB
} #If ($tmpMB + $targetMB -gt $MBPerDatabase)
} #ForEach $yUser
} #ForEach $item
Write-Host "`nSUMMARY" -Foregroundcolor Green
Write-Host "Ideal MB Per Database:………"$MBPerDatabase
$MailboxArray | Group Target | %{
New-Object psobject -Property @{
Item = $_.Name
Sum = ($_.Group | Measure-Object Size -Sum).Sum
}
}
} #If ($ByMailboxSize)
If ($ByMailboxCount){
Write-Host "`nBY MAILBOX COUNT" -Foregroundcolor Red
Write-Host "—————-"
Write-Host "Check to see if the Excess Mailboxes = Required " -NoNewLine
$tmpcheck = ($DatabaseMatrix | Measure-Object Difference1 -Sum).sum
Write-Host $tmpcheck -ForegroundColor Green
Write-Host "`nFinding databases with excess mailboxes"
$Database2MoveOff = $DatabaseMatrix | Where {$_.Difference2 -ge 0}
$ExcessTotal = 0
ForEach($db in $Database2MoveOff){
Write-Host $db.Name -Foregroundcolor Blue
Write-Host "Removing"$db.Difference2 "users`n"
$ExcessTotal += $db.Difference2
$MailboxArray | Where {$_.Database.Name -eq $db.name} | Select -First $db.Difference2 | ForEach{$_.Target = "";$_.Status = "Move"}
}
Write-Host "Total Excess Mailbox " $ExcessTotal
$i=0
ForEach($item in $DatabaseMatrix | Where {$_.Difference1 -gt 0}){
$Mailboxes2Add = $item.Difference1
$MailboxArray | Where {$_.Target -eq ""} | Select -First $Mailboxes2Add | ForEach{$_.Target = $item.Name}
}
Write-Host "`nSUMMARY" -Foregroundcolor Green
$MailboxArray | Group Target
}#ByMailboxCount
#Foreach($line in $MailboxArray){Write-Host $line.Email"`t"$line.database}
Write-Host "`nMove Mailboxes"
$outCSV = @()
$ExcessMailboxes = $MailboxArray | where {$_.Status -eq "Move"}
ForEach($item in $ExcessMailboxes){
$tmpOutCsv = "" | Select email, TargetDatabase
$tmpOutCSV.email = $item.email
$tmpOutCsv.TargetDatabase = $Item.Target
$outCSV += $tmpOutCSV
}
ForEach($line in $outCSV){
$position=$host.ui.rawui.cursorposition
Write-Host $line.email
$position.x = 50
$host.ui.rawui.cursorposition=$position;
Write-host $line.target
}
$outCSV | Export-csv $ExportCSV -NoTypeInformation





Comments Off 



