Blog Posts by chucksteel

Ask a question

Possibly useful queries

I tend to write a lot of queries for the K1000 and I have decided to share them. I created a GitHub repository a while back and have been putting more effort into maintaining it and even started to add comments to the queries. Hopefully it will be a resource for others in the community.

View comments (1)

Linking Power BI to the K1000

I have started a series on my blog on using Microsoft Power BI with the K1000 database. I know that there have been others doing similar work and wanted to contribute to the effort.
View comments (1)

Custom Inventory Rules Querying values in plist files

I am trying to use the PlistValueEquals function in a Custom Inventory Rule to check the value of an item but it won't work properly. I believe the issue is being caused by the value being nested inside of a dictionary. The plist looks like this:
Dict {
RepeatingPowerOn = Dict {
time = 1200
weekdays = 8
eventtype = wakepoweron

When I try to check the value for time it does not return properly. Even when using PlistValueReturn(/Library/Preferences/SystemConfiguration/, time, NUMBER) to see what the value is I do not get anything back.

I have also tried PlistValueReturn(/Library/Preferences/SystemConfiguration/, RepeatingPowerOn, TEXT) and this returns the following:
Dict {
time = 1260
weekdays = 8
eventtype = wakepoweron
} [string]

Note that in the database the value appears as:
'Dict {<br/> time = 1260<br/> weekdays = 8<br/> eventtype = wakepoweron<br/>}'

However, this rule: 
PlistValueEquals(/Library/Preferences/SystemConfiguration/, RepeatingPowerOn, TEXT, Dict {<br/> time = 1260<br/> weekdays = 8<br/> eventtype = wakepoweron<br/>})
does not work to identify machines with those settings.

We are trying to detect the power on settings for the machines in our inventory so that we can deploy the settings that we would like to be in place.

By checking the syntax for the PlistBuddy command on macOS I found that you can query keys inside of a dictionary by using colons. The same syntax works for the Plist functions in custom inventory rules. Using that logic, this rule works:
PlistValueEquals(/Library/Preferences/SystemConfiguration/, :RepeatingPowerOn:weekdays, NUMBER, 8) and PlistValueEquals(/Library/Preferences/SystemConfiguration/, :RepeatingPowerOn:time, NUMBER, 1200) and PlistValueEquals(/Library/Preferences/SystemConfiguration/, :RepeatingPowerOn:eventtype, TEXT, wakepoweron)
Be the first to comment

Creating an Office 2016 package for Mac Deployment

I combined several resources to create our Office 2016 for Mac installer. The steps below outline the process that I followed. The resources I used include the following:

Things you will need:

* The scripts from the above sites

* A copy of the volume serializer package from the Microsoft Volume Licensing website (Microsoft_Office_2016_VL_Serializer.pkg). This is found inside of the Office 2016 for Mac download.

* The Packages app for creating a combing package.

* The post_install script for the package (

* A customized package from the Outlook Exchange setup site above (not covered in this document)

The basic process is as follows:

1. Create a package that installs Office 2016

2. Combine the Office 2016 package with the Outlook Configuration package and the script to update dock items.

3. Place the combined package in a disk image

4. Create the software title on the K1000

5. Create the managed install on the K1000

Creating the Office 2016 Package

1. Create a folder on your computer to create the package. I recommend something like /temp/Office2016

2. In the folder create a folder titled volume_license

3. Place the Microsoft_Office_2016_VL_Serializer.pkg file in the volume_license folder.

4. Open Terminal and change to the folder you created in step 1.

5. Run the script. The script will download the required files and create a folder called result.

6. Open the result folder and mount the disk image found there.

7. Copy the Office installer package to the folder you created in Step 1.

Combining the Office Package with the other components

1. Open the Packages app.

2. Create a new package. I recommend saving it in the same folder that you created above in step 1. I named my package Office2016Deployment.

3. On the Settings tab change the identifier to match your organization.

4. Set the version to the Office version that was created by the script above.

5. On the Scripts tab add the following files to the Additional Resources pane

a. Dockutil

b. The Office 2016 package you built above

c. The Outlook Auto configuration package. If you built a new Outlook Auto Configuration package change the name to OutlookAutoConfig.pkg before adding it to the resources.

6. Set the Post-installation script to the post_install script supplied. The post install script performs the following actions:

a. Installs Office 2012

b. Installs the Outlook configuration package

c. Updates the dock for all users

d. Removes Office 2011

7. Save the package

8. Build the package (click Build, Build).

Place the package in a disk image

1. In Terminal change to the directory you created above

2. Packages should have placed the output of the combined installer in a folder named build. Verify that it is there.

3. Use the following command to create a disk image with the package: hdiutil create –format UDZO –srcfolder build/Office2016Deployment.pkg Office2016.<version>.dmg Where <version> is the version number of Office, e.g. Office2016.15.21.1.dmg If you named your package something other than Office2016Deployment then change the srcfolder option accordingly.

Create the Software Title on the K1000

Unfortunately the K1000 doesn't detect the Microsoft Office Suite for Mac as an installed application because there isn't one .app that is Office. We will create a custom software title that detects the version of Word instead:

1. In the K1000 interface click Software

2. Click Choose Action, New

3. Enter Microsoft Office 2016 for Mac Standard for the name

4. Enter the version number

5. Select the supported operating systems

6. Enter the following for the custom inventory rule: PlistValueEquals(/Applications/Microsoft, CFBundleVersion, NUMBER, 15.19.1) Use the correct version number for the package you created.

7. Associate the disk image you created earlier.

8. Save the software title.

Create the Managed Install on the K1000

When KACE sees a disk image as part of a managed install it will mount the image and install and packages contained on the drive. Because we uploaded a disk image to the software title that means we can leave the defaults for the managed install in place.

1. In the K1000 interface click Distribution

2. Click Choose Action, New

3. Select the Office title that you just created from the Software dropdown menu.

4. Enter Office 2016 for Mac – Removes 2011 or something similar for the name.

5. Set the Execution menu to "With user logged off"

6. Select a test device in the Devices section

7. Click Save

Edit: 2017/11/03 - removed space from -srcfolder argument in hdiutil command.

View comments (8)

Calculating User Folder Sizes

Our department is evaluating desktop backup solutions and we wanted a good way to estimate how much space would be required to backup all of our users's data. The K1000 reports disk space used on computers but estimating how much of that is user data vs operating system and applications is difficult. In order to get a better estimate I created two custom software inventory rules to calculate the size of C:\Users on Windows and /Users on MacOS:

Windows Rule:
ShellCommandTextReturn(powershell -Command "& {Get-ChildItem C:\Users -recurse -force -ErrorAction "SilentlyContinue" | Measure-Object -property length -sum -maximum -minimum}")
Example output:
Count : 156707
Average : 
Sum : 100229316154
Maximum : 1033927956
Minimum : 0
Property : length

MacOS Rule:
ShellCommandTextReturn(du -hd 0  /Users)
Example output:
8.0G /Users

Here is a SQL report that pulls in this data:
ROUND(DISK_SIZE, 0) as "Total Disk Available",
ROUND(DISK_USED, 0) as "Total Disk Used",
    WHEN MACHINE.OS_NAME like 'Mac%' and MACUS.STR_FIELD_VALUE like "%G%" THEN substring_index(MACUS.STR_FIELD_VALUE, "G", 1)
WHEN MACHINE.OS_NAME like 'Mac%' and MACUS.STR_FIELD_VALUE like "%M%" THEN round(substring_index(MACUS.STR_FIELD_VALUE, "M", 1)/1000,2)
    WHEN MACHINE.OS_NAME like 'Mic%' THEN round(substring_index(substring(WINUS.STR_FIELD_VALUE, LOCATE("Sum      : ", WINUS.STR_FIELD_VALUE)+ 11), "<br/>", 1)/1000000000, 0)
END as `User Folder Size (G)`
HAVING `User Folder Size (G)` > 0
Note that since this uses custom inventory fields the Software IDs will be unique to your environment if you want to replicate this. In my case the IDs are 85480 and 85481, find those values in the SQL code above and replace them with the values from your appliance.

Be the first to comment
Showing 1 - 5 of 16 results

Top Contributors

Talk About Desktop Management