One of the requirements for managing mobile devices in an organization is reporting on users with a mobile device, the model or type of device, and optionally other information such as the DeviceID, the time of the last successful connection.
In How to get a list of Exchange ActiveSync users we list Exchange ActiveSync (EAS) users on Exchange 2007. You can use the Get-ActiveSyncDeviceStatistics cmdlet (Exchange 2010 SP1 version) to list EAS device statistics such as the device model number, device OS, device IMEI (International Mobile Equipment Identification, a 15 or 17-digit ID that uniquely identifies a specific phone or device on a mobile network— think of it as the hard-coded MAC address for a phone), last sync time, last policy update time, etc. for a mailbox user.
Get-ActivesyncDeviceStatistics -Mailbox [email protected]
The output:
FirstSyncTime : 12/22/2007 1:34:10 AM
LastPolicyUpdateTime : 12/22/2007 1:34:43 AM
LastSyncAttemptTime : 1/14/2008 7:45:15 AM
LastSuccessSync : 1/14/2008 7:45:15 AM
DeviceType : PocketPC
DeviceID : *******************************
DeviceUserAgent :
DeviceWipeSentTime :
DeviceWipeRequestTime :
DeviceWipeAckTime :
LastPingHeartbeat :
RecoveryPassword : ********
DeviceModel : WIZA100
DeviceIMEI : ************21900
DeviceFriendlyName : Pocket_PC
DeviceOS : Windows CE 5.2.19134
DeviceOSLanguage : English
DevicePhoneNumber : 1650*******
Identity : [email protected]\AirSync-PocketPC-*******************************
Note: The Identity, DeviceId, DeviceIMEI and DevicePhoneNumber properties are masked in the above output using the * character to protect identifiable information.
Some users may have more than 1 device, or perhaps the user simply got a new smartphone and the old device partnership has not been removed.
Here’s a a quick code snippet (it can probably be scrubbed up a little… ) that will list users and all their devices, along with first sync and last successful sync times:
$mbx = get-casmailbox | where {$_.hasactivesyncdevicepartnership -eq $true -and $_.identity -notlike “*CAS_{*”} ; $mbx | foreach {$name = $_.name; $device = get-activesync devicestatistics -mailbox $_.identity; $device | foreach {write-host $mbx.name, $_.devicemodel, $_.devicephonenumber, $_.deviceid, $_.FirstSyncTime, $_.LastSuccessSync} }
Making it more efficient: Server-side filtering using the Filter parameter
Well, the above code could be scrubbed up a little. Rather than getting all mailboxes using Get-CASMailbox and filtering them on the client-side using the Where-Object cmdlet, a more efficient way of doing this is filtering on the server-side using the Get-Mailbox cmdlet with the -Filter parameter, and getting only the mailboxes which have an ActiveSync device partnershp.
Yes, I’ve just realized HasActiveSyncDevicePartnership is in fact a filterable property, listed under Advanced Filterable Properties in Filterable Properties for the -Filter Parameter in Exchange 2007 SP1.
Here’s the updated version:
$mbx = get-casmailbox -Filter {HasActivesyncDevicePartnership -eq $true -and -not DisplayName -like “CAS_{*”}; $mbx | foreach {$name = $_.name; $device = get-activesync devicestatistics -mailbox $_.identity; $device | foreach {write-host $name, $_.devicemodel, $_.devicephonenumber, $_.deviceid, $_.FirstSyncTime, $_.LastSuccessSync} }
The output looks like this:
Bharat Suneja WIZA100 16501231234 353B7ACF5014C020CE22CBF1DB7FFD92 11/5/2007 7:41:29 AM 12/20/2007 11:00:15 PM
Bharat Suneja WIZA100 16501231234 7E6B67F47DFD370E89BE13280A75EAA5 12/22/2007 1:34:10 AM 1/14/2008 7
UPDATES
3/7/2012: Exchange 2010 also has the new Get-ActiveSyncDevice cmdlet you can use, although Get-ActiveSyncDeviceStatistics provides more details. Topic for a future post.
3/7/2012: The HasActiveSyncDevicePartnership property is set to true when the user connects to the mailbox using ActiveSync for the first time (and a device partnership is created). However, if you remove the last device from a mailbox using the Remove-ActiveSyncDevice cmdlet, the property isn’t flipped back to false. If it’s important that mailboxes with no device partnerships be returned, you may need to set the property to $false by running a command or script.
{ 67 comments… read them below or add one }
Next Comments →
Is there a shell command that will list all the users that have a mobile device and what the DeviceFriendlyName is? I know you can do it by mailbox using the command Get-ActiveSyncDeviceStatistics -Mailbox: “alias” however, I need to provide a list to management of what kinds of phones are connecting and from which department.
I did post this question on the Microsoft.Public.Exchange.Mobility newsgroup called “Shell command for all mobile devices?” However, I didn’t receive a answer so John Oliver, Jr. [MVP] suggested that I contact you through your blog. Any help you can provide is appreciated
Thanks.
Penny
@Penny: The above command will get you the output you need. DeviceFriendlyName is one of the parameters output by Get-ActiveSynCDeviceStatistics.
Use this:
$mbx=get-casmailbox -Filter {HasActiveSyncDevicePartnership -eq $true -and -not Disp
layName -like “CAS_{*”};
$mbx | foreach {$name = $_.name; $identity = $_.identity; $device=get-activesyncdevi
cestatistics -mailbox $_.identity; $device | foreach {write-host $mbx.name, $_.devicefriendlyname, $
_.devicemodel, (get-user $identity).department} }
You can add additional fields such as first sync/last sync times or phone numbers as shown in the post.
That gets me in the right directions, thank you. I’m going home now so I’ll work with this script again in the morning.
Penny
Any idea why I can never get a display name back as you have it?
Seems as if the $mbx.name portion is always blank.
Thanks
Jon
I wasn’t able to get the DisplayName or the Mailbox to show for me either, but the “Identity” property worked for me. Try this:
$mbx = get-casmailbox -Filter {HasActivesyncDevicePartnership -eq $true -and -not DisplayName -like “CAS_{*”}; $mbx | foreach {$name = $_.name; $device = get-activesyncdevicestatistics -mailbox $_.identity; $device | foreach {write-host $mbx.name, $_.devicemodel, $_.devicephonenumber, $_.Identity, $_.deviceid, $_.FirstSyncTime, $_.LastSuccessSync} }
— The addition of $_.Identity gave me what I needed. I don’t know if this is the best way to go about getting it, maybe the original poster might know! ;) Seems like $mbx.name is intended to give the information we need, but doesn’t seem to be working for me and the poster above me.
Does the –Filter applies to only Get-CasMailbox on the server side processing or does it also applies to pipelined cmd-let Get-ActiveSyncDeviceStatistics?
Since Get-ActiveSyncDeviceStatistics does not directly support –Filter I am not sure where the actual processing takes place.
@Anonymous from March 24: The filter applies to Get-CASMailbox, which returns a set of mailboxes after filtering it on server-side. You iterate through each mailbox returned (using the foreach), passing it on individually to Get-ActiveSyncDeviceStatistics.
But does the processing of “Get-ActiveSyncDeviceStatistics”
takes place on the client host CPU or the Server CPU?
@Anonymous from March 24:
How to filter the active sync users with department names?
@tylergohl : The command that you mentioned did not work for us. I have updated the command to include the following : $identity = $_.identity
After which the command worked like a charm.
$mbx = get-casmailbox -Filter {HasActivesyncDevicePartnership -eq $true -and -not DisplayName -like "CAS_{*"}; $mbx | foreach {$name = $_.name;$identity = $_.identity;$device = get-activesyncdevicestatistics -mailbox $_.identity; $device | foreach {write-host $mbx.name, $_.devicemodel, $_.devicephonenumber, $_.Identity, $_.deviceid, $_.FirstSyncTime, $_.LastSuccessSync} }
this command is great, the question i have now is what can i run to disable activesync for everyone who does not come back from this query?
How do you get all of this to writ to a text file? I tried piping it with > c:\asu.txt at the end, but that did not work.
@Anonymous from Sep. 18th: You can use out-file or also look at export-csv.
When I try out-file or export-csv with this command it does not write to the csv file.
$mbx = get-casmailbox -Filter {HasActivesyncDevicePartnership -eq $true -and -not DisplayName -like "CAS_{*"}; $mbx | foreach {$name = $_.name;$identity = $_.identity;$device = get-activesyncdevicestatistics -mailbox $_.identity; $device | foreach {write-host $mbx.name, $_.devicemodel, $_.devicephonenumber, $_.Identity, $_.deviceid, $_.FirstSyncTime, $_.LastSuccessSync} }
Blueschica, I was able to accomplish this by using a two-step process…try this:
1) At [PS] prompt, use the following (this should produce the results on screen):
$mbx = get-casmailbox -Filter {HasActivesyncDevicePartnership -eq $true -and -not DisplayName -like "CAS_{*"}; $mbx | foreach {$name = $_.name;$identity = $_.identity;$device = get-activesyncdevicestatistics -mailbox $_.identity; $device | foreach {write-host $mbx.name, $_.devicemodel, $_.devicephonenumber, $_.Identity, $_.deviceid, $_.FirstSyncTime, $_.LastSuccessSync} }
2) After the result is returned, at the [PS], use the following (should use the $mbx information and write it to the designated file):
out-file -filepath C:\Test1\process.txt -inputobject $mbx -encoding ASCII -width 120
Running something like "Get-ActivesyncDeviceStatistics -mailbox [email protected]" does not return anything for me (not even an error). I know the mailbox exists because I can also see that ActiveSync is enabled by doing a "Get-CASMailbox -identity [alias | mailbox]"
Anyone have an idea why?
We're running a mixed Exchange 2003 / 2007 environment with the AD schema updated for 2007. I have tried mailboxes residing on both 2003 and 2007 servers.
Simply having ActiveSync enabled does not mean there's a device partnership for the mailbox – all it means is a device will be able to connect. If there's no device, no statistics are returned.
Use the following command to determine if an ActiveSync partnership exists for the mailbox:
Get-CasMailbox [email protected] | Select identity,ActiveSyncEnabled,HasActiveSyncDevicePartnership
@Anonymouse from Nov. 24 7:37 AM: Thanks for responding!
The mailbox I am testing against has 6 ActiveSync devices listed in the Mobile Admin console (running on an Exchange 2007 CAS). However, the mailbox resides on a Exchange 2003 server. The command you posted results in a 'false' answer for ActiveSync Partnership. I'm guessing this has something to do with the mixed 2003/2007 environment.
Thanks for the help.
@Farhanible: The cmdlet doesn't work against Exchange 2003 mailboxes. You can use the Microsoft Exchange Server ActiveSync Web Administration Tool (can only query one mailbox at a time) or LogParser to get this information.
Yes, I have the MobileAdmin utility installed, which does its job well. However, I have a list of users that I need to report on. I'm modifying Glen's vbscript to make it work for my csv list of usernames. I'll post it here for everyone to use.
I can't get all the informaion from the command to a text or csv file. Has anyone been able to capture all the data?
Hi,
How to get the Activesync mailbox statitistics for 1 complete server or Entire users in a domain
Regards,
Divyakumar
Hi,
How should i get the Activesync statistics for all the users in an organisation?
Nice..thank you.. output to a file good
the easiest way to capture the text is to use the start-transcript command prior to running the ps commands.
@Blueschica (and anyone else looking to export this data)
Try this one-line command if you want to export this data to a text file:
Get-CASMailbox -Filter {HasActivesyncDevicePartnership -eq $true -and -not DisplayName -like “CAS_{*”} -ResultSize:Unlimited | ForEach {Get-ActiveSyncDeviceStatistics -Mailbox:$_.Identity} | export-csv c:\test\MobileDevicesReport.csv
THis command:
$mbx = get-casmailbox -Filter {HasActivesyncDevicePartnership -eq $true -and -not DisplayName -like “CAS_{*”}; $mbx | foreach {$name = $_.name;$identity = $_.identity;$device = get-activesyncdevicestatistics -mailbox $_.identity; $device | foreach {write-host $mbx.name, $_.devicemodel, $_.devicephonenumber, $_.Identity, $_.deviceid, $_.FirstSyncTime, $_.LastSuccessSync} } | export-csv C:\test\test.csv
echoes all the matching mailboxes to the screen and writes the test.csv file in the proper location. However, the file has a size of zero kb and is blank.
What am I doing wrong?
Thanks in advance for th help!
Hi
I get the same problem as JDH, the file created is zero kb…
Any suggestions?
Please tell me someone has an answer to this. Because I’m having the SAME issue. I really need a nice list from this command. I think there are too many pipes going on for it to output to CSV.
Hi, can you help me with something…
I need a list of mailboxes that has activesync running for the last 90 days… what will be my powershell ?
THanks
Thaister
In Exchange 2010, an Active Directory child object is created in the user’s container for each ActiveSync device partnership, so this is much easier to determine using the following:
Get-ActiveSyncDevice | ? {$_.WhenCreated -lt (get-date).adddays(-90)}
Or, to get a subset of device attributes (name,userdisplayname,whencreated):
Get-ActiveSyncDevice | ? {$_.WhenCreated -lt (get-date).adddays(-90)} | ft name,userdisplayname,whencreated
Note, the above commands will get you a list of ActiveSync devices that have been activated more than 90 days ago.
when i ran Get-ActiveSyncDevice | ? {$_.WhenCreated -lt (get-date).adddays(-90) it shows : >>
what does >> mean?
>> means PowerShell thinks the command you just entered is incomplete — and thanks for pointing out the error. :)
Needed to add a } after adddays.(-90) to close the Where-Object loop. (Note, ? is an alias for the Where-Object cmdlet used to filter objects in the pipeline.)
Updated previous comment.
Hi. Thanks for the quick reply, but after running it.. its ask for another input
Identity=
what should i put in there?
Are you trying this on Exchange 2010? Get-ActiveSyncDevice is an Exchange 2010 cmdlet. Identity is not a required parameter for Get-ActiveSyncDevice.
Sorry im new to this.. so what will be the correct one?
1. Need a list of users that has Activedevice sync enable and running for the last 90 days. ?
2. Need to export them on a csv file.
Thanks for the help. i appreciate it.
For Exchange 2010:
Get-ActiveSyncDevice | ? {$_.WhenCreated -lt (get-date).adddays(-90)} | ft name,userdisplayname,whencreated
if you change write-host to write-output, you can pipe it to out-file. Like this:
$mbx = get-casmailbox -Filter {HasActivesyncDevicePartnership -eq $true -and -not DisplayName -like “CAS_{*”}; $mbx | foreach {$name = $_.name;$identity = $_.identity;$device = get-activesyncdevicestatistics -mailbox $_.identity; $device | foreach {write-output $mbx.name, $_.devicemodel, $_.devicephonenumber, $_.Identity, $_.deviceid, $_.FirstSyncTime, $_.LastSuccessSync } } | out-file c:\output\report.txt
Thx for the feedback!
I have a client who has 100+ activesync users, when they have a DAG failover the activesync devices need to be manually reset using Remove-ActiveSyncDevice -identity ‘etc.etc.etc’ some users have more that 1 device iphone/ipad etc. I have looked for a script that would perform the reset of all devices in activesync but have not found anything. Any recommendations on a script? (i do know the cause is SP1 on failover site but not home site and that make fix it.) I am not allowed to upgrade to sp1 on other site currently, not approved until 1st qtr 2011. thanks in advance.
d
Below is a script we modified from the one above to write all results out to a CSV file. Make usre the path exists where you want to write out the file to.
$csvRows=@()
“==============================================================”
“Start Mailbox Retrieve”
“==============================================================”
$mbx = get-casmailbox -ResultSize unlimited | where {$_.hasactivesyncdevicepartnership -eq $true -and $_.identity -notlike “*CAS_{*”} ;
“==============================================================”
“End Mailbox Retrieve”
“==============================================================”
$mbx | foreach {
“Processing: “+$_.name
$name = $_.name;
$device = get-activesyncdevicestatistics -mailbox $_.identity;
if($device){
foreach($dev in $device){
” Device: “+$dev.DeviceType
$csvRows += $dev
}
}
}
“==============================================================”
“Start CSV Write”
“==============================================================”
$csvRows | Export-Csv “c:\Temp\phonelist.csv” -NoType
“==============================================================”
“End CSV Write”
“==============================================================”
I’ve been wanting to update with an enhanced script when time permits. This will help many readers. Thanks!
This is great information, thanks All! I can get all the information that I need in the powershell display, however I am REALLY struggling with getting into a usable csv format so that I can sort/filter/group in excel.
I see that UHS-IT has written a script, call me a novice, but where/how should this script be saved? how is this used? its not powershell it does not appear? do I save this script as bat/cmd/etc and then execute?
thanks in advance!
Save it in any directory/folder on your server, start Exchange Management Shell and run the script.
For more info, see:
Exchange Management Shell Basics
Scripting with the Exchange Management Shell -> Running a script inside the Exchange Management Shell
Im trying to run the script from above but it doesn’t seem to be working for me..
this is the error I am getting:
[PS] C:\Windows\system32>\Get-sync.ps1
The term ‘\Get-sync.ps1’ is not recognized as the name of a cmdlet, function, s
cript file, or operable program. Check the spelling of the name, or if a path w
as included, verify that the path is correct and try again.
At line:1 char:14
+ \Get-sync.ps1 <<<<
+ CategoryInfo : ObjectNotFound: (\Get-sync.ps1:String) [], Comma
ndNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Any help would be great..
there is discrepancy in my environment (exchange 2007) for some users where get-casmailbox shows hasactivesyncdevicepartnership as false however get-activesyncdevicestatistics shows that device actually has partnership. is it a bug?
Probably incorrect information is only for users moved from 2003 to 2007.
this script was right on..
Question, how do i get the display name and return ? and sort by LastSuccessSync
?
$csvRows=@()
“==============================================================”
“Start Mailbox Retrieve”
“==============================================================”
$mbx = get-casmailbox -ResultSize unlimited | where {$_.hasactivesyncdevicepartnership -eq $true -and $_.identity -notlike “*CAS_{*”} ;
“==============================================================”
“End Mailbox Retrieve”
“==============================================================”
$mbx | foreach {
“Processing: “+$_.name
$name = $_.name;
$device = get-activesyncdevicestatistics -mailbox $_.identity;
if($device){
foreach($dev in $device){
” Device: “+$dev.DeviceType
$csvRows += $dev
}
}
}
“==============================================================”
“Start CSV Write”
“==============================================================”
$csvRows | Export-Csv “c:\Temp\phonelist.csv” -NoType
“==============================================================”
“End CSV Write”
“==============================================================”
Hi,
Thanks for the script, it is possible to run the same for individule server instead for whole orgination
Hi Bharat, do you have any shell command for find” how many active sync users connected to exchange CAS server ” or How many Curent Active sysn sessions ( Active sync connections)
Hey Bharat,
When I run this script below I get the desire results on screen (PS screen). So I see how many users are using what device but when I try to export this file to either a CSV or txt. I get all the wrong results in the file. THe file shows me username, activesyncenabled, Owa Enabled etc but it wont really give me data that is showing on PS screen. Can you help plz? What I need is what type of username, device, department.
thanks
$Mailbox = get-casmailbox -resultsize unlimited -Filter {HasActivesyncDevicePartnership -eq $true -and -not DisplayName -like “CAS_{*”}; $mailbox | foreach {$name = $_.name; $identity = $_.identity; $device = get-activesyncdevicestatistics -mailbox $_.identity; $device | foreach {write-host $mailbox.name, $_.devicemodel, $_.devicephonenumber, $_.Identity, $_.deviceid, $_.deviceFriendlyName, $_.devicemodel, (get-user $identity).department } }
Dear experts,
we have shell commands that show the statistics, commands to lock an account to a specific phone and to remove the lock, but there doesn’t appear to be a shell command that can tell you if a given account is locked to a device or not locked to a device. I need this distinction as we lock users accounts to specific devices so that they only use approved devices. I’d like to know whether an account is locked or not !!
Hi Jon,
I am looking for same script as you. Have you got any?
Taj
Bharat ! thank you for your helpful advice on the topic.
Here’s what I need to do…
threshold=(some number) say 120
have the script find devices that haven’t connected via activesync in that threshold and then
Remove-ActiveSyncDevice
that would help me clean up my list of old devices…
Thoughts anyone?
Chris,
I am looking for the same script! If you’ve found one let me know.
Thank you.
Hi.
I am trying to modify the command, so that I can include a certain DeviceUserAgent string – But can’t seems to get it right.
I want to use the output to assign a new ActiveSyncPolicy to the devices.
Can anyone please help me complete this..
Hi ,
can any help me in.
i want to create an outlook rule whenver someid send me a mail it will delete.( that is i can create without any issue) my requirement is how many User ID i can ADD in from ( Sender list).
The term ‘Get-ActiveSyncDeviceStatistics’ is not recognized as the name of a cmdlet, function, script file, or operable
program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
How do I fix this?
Which version of Exchange Server? Do you see any AcitveSync-related cmdlets (use Get-Command -Noun ActiveSync*)?
If in regular powershell on the server, issue Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin
First of all, let me express how much I HATE Powershell….
Now that I got that off my chest, why is it that I can get results onscreen but when I try to export to .csv or text files, I get a succession of RemotePipelineExecutionFailed? I’m using the command/scripts above but cannot get any data that would fit in the screen or page. “Identity” is a few hundred characters wide and is always truncated; anything else (Name, PrimarySmtpAddress, Alias, etc.) just comes up blank. I am getting some of the information I need, it’s just the output/formatting that is useless. Any suggestions would be appreciated, forgive me for venting.
Jose, check out the following resources about PS output formatting:
Handle Formatted Output in PowerShell
http://blogs.technet.com/b/heyscriptingguy/archive/2011/05/13/handle-formatted-output-in-powershell.aspx
http://technet.microsoft.com/en-us/magazine/2008.06.windowspowershell.aspx
Using Export-CSV cmdlet
http://technet.microsoft.com/en-us/library/ee176825.aspx
Hi,
I would like to know what is FirstSynctime? Since there was a query from my auditor. As we disable the user and mailbox features, post disable still device stats shows latest date.
e.g: User left on 2013, but firstsynctime shows 2015 also last sync date shows as 2013.
the query is why firstsync time shows latest date.. and on what scenario it will show.
Please update.
It’s when the EAS partnership was created and the device sync’ed for the first time. Not sure why it would’ve changed – perhaps if the mailbox was moved.
Hi Bharat,
Thanks for your reply.. I could able to cross check with recent mailboxes which I have moved to different DB. it seems what you have said it correct. But do you have any article that talk about this changes.
thanks
No, I don’t.
i have a question regarding “last successful sync”. why on some users it returns empty even though the user have checked his email a few days back?
{ 1 trackback }