It happened to me that during the day I found one of our SMS servers a bit unresponsive. After short investigation I found out that a lot of collections is refreshing at the same time and therefore my refresh was in the queue. As the refresh is by default set for everyday, to the time when the collection was created, it can happen that there are some peaks when most of our collections are refreshing. So I decided to check this.

Looking into SMS SDK I found necessary information


and was able to check RefreshSchedule with Get-WmiObject cmdlet.

__GENUS          : 2
__CLASS          : SMS_ST_RecurInterval
__SUPERCLASS     : SMS_ScheduleToken
__DYNASTY        : SMS_ScheduleToken
__RELPATH        :
__DERIVATION     : {SMS_ScheduleToken}
__SERVER         :
__NAMESPACE      :
__PATH           :
DayDuration      : 1
DaySpan          : 1
HourDuration     : 0
HourSpan         : 0
IsGMT            : False
MinuteDuration   : 0
MinuteSpan       : 0
StartTime        : 20040614175400.000000+***

As you can see, StartTime is in standard obscure WMI format and we are able to convert it to standard DateTime format easily (if you want to see more, you can check nice post from Shay Levy).

We have all info so can build short function:

function Get-SMSCollectionRefreshTime
    $colls = Get-WmiObject -ComputerName vmsms01 -Namespace root\sms\site_xxx -Class SMS_Collection

    foreach ($coll in $colls)

It will produce long list of refresh schedules for all our collections.

Note: You can see that in the list are some other properties and if you are interested, you can find more at SMS_ST_RecurInterval MSDN page. Most of our collections are set to refresh daily (in case of direct membership we are not refreshing at all) but we have few (three) to refresh more often. In the following code I will count all collections as if they are refreshed daily. If you have more frequently updated collections, you can think about modifying the code.

After some experimenting I came with following code:

Get-SMSCollectionRefreshTime | `
    Select @{l="Hour";e={"{0:d2}" -f $([System.Management.ManagementDateTimeConverter]::ToDateTime($_.StartTime)).Hour}} | `
    Group Hour | Select Name, Count, @{l="Graph";e={"*"*$($_.Count/2)}} | Sort Name | ft -AutoSize -Wrap

which produced following result:

Name Count Graph

—- —– —–

00      16 ********

02       2 *

03       2 *

04       6 ***

05      10 *****

06      66 *********************************

07      22 ***********

08      94 ***********************************************

09     125 **************************************************************

10     163 **********************************************************************************

11     141 **********************************************************************

12      79 ****************************************

13      86 *******************************************

14     118 ***********************************************************

15     166 ***********************************************************************************

16     101 **************************************************

17      99 **************************************************

18      61 ******************************

19      33 ****************

20      12 ******

21       2 *

22       1

23      12 ******

So based on this result, most of our collections are refreshed during 10AM-11AM and 3PM-4PM intervals. Let me describe the code used.

  1. First Select is pretty big construction. I used computed value where the conversion from WMI time is running ([System.Management.ManagementDateTimeConverter]::ToDateTime($_.StartTime)), from the result I then used just the hour and format it using –f operator (“{0:d2}” -f $(…)).
  2. Then Group it based on computed hour so can see frequency during the day. At the first time I stopped here as I already saw requested data (number of collection refreshed at specific time). But to have more fun I continued…
  3. Select hour, number of collections and show “graph” represented by stars. I found out that because of big peaks it’s better to multiply result by two to have all stars at one screen (“*”*$($_.Count/2)).
  4. Then I Sort results by hour,
  5. and Format result as table.

Whole work didn’t take longer than five (OK – maybe 10) minutes and I was able to confirm my first thoughts. Next task is to check collections refreshed in peaks and decide what can be changed to different time (preferably overnight). But – it will be (maybe) another post.

Note: I have small piece of paper hung at my screen in the office. It contains this citation:


I am looking to it during the day and today I confirmed it again.