About Me


Zachary Loeber is an IT enthusiast with over a decade of experience in the field. Zach cut his teeth on a Tandy 2000 and BBS’s of the late 80′s and has been programming, building, and networking computers ever since.

When it comes to technology Zach’s primary interests are:

  • Security
  • Networking
  • System Administration
  • Linux
  • Windows
  • VMware
  • Exchange 2010
  • Powershell
  • Automation

Some of Zach’s other interests include lifting weights, camping, running, self-improvement, and being a good husband. More information can be found on his linked in page.

View Zachary Loeber's profile on LinkedIn

Comments (30)

  1. 4:06 AM, 04/16/2018Perez Marlon  / Reply

    Hello Zach, I was interested in your PSVVX-Master project. I would like to retrieve some informations from our Polycom phones through the differents functions you created so I can monitor/check if any of our Trios in the conferencing rooms are disconnected from Skype for Business. So my question is about the credentials. I’m using the admin credentials for the web interface/phones, but for some reason I get the following message : WARNING: Get-VVXLineInfo: 192.168.xxx.xxx – Device either invalid or is not on a call.

    I get this for every function that uses the credentials. The Find-VVXDevice works fine though.

    Are there others credentials about the phones involved ?

    • 8:00 AM, 04/23/2018Zachary Loeber  / Reply

      You will have to push out the settings required for remote rest calls to work () I believe. Also, just try using the case-sensitive user id of ‘Polycom’ with the device local admin password (defaults to 456). I welcome any pull requests to the git repo for this mini-project. Unfortunately since I’m not a Polycom partner I’m not privy to the actual REST documentation that would allow me to further expand upon this module. Everything in this has been reverse engineered from this project (which looks to have had more added since I released things). This module was meant to decouple the VVX scripting from just S4B and eliminate the SQL server tie in calls which make the tool only suitable for an on premise deployments. Cheers, Zach.

  2. 2:00 PM, 03/13/2017Jeremy Bradshaw  / Reply

    Hi Zachary,

    I have managed to semi-plagiarise from one of your scripts. I can’t find a better way to do this:

    if (-not $ShowAll) {
    # These are some standard user exceptions you may find in your environment
    # You can supply your own list by including -ShowAll and -AdditionalUserFilters
    # in the same call.
    $UserExceptions = @(
    “*\Organization Management”,
    “*\Domain Admins”,
    “*\Enterprise Admins”,
    “*\Exchange Services”,
    “*\Exchange Trusted Subsystem”,
    “*\Exchange Servers”,
    “*\Exchange View-Only Administrators”,
    “*\Exchange Admins”,
    “*\Managed Availability Servers”,
    “*\Public Folder Administrators”,
    “*\Exchange Domain Servers”,
    “*\Exchange Organization Administrators”,
    else {
    $UserExceptions = @()
    $UserExceptions += $AdditionalUserFilters

    if ($UserExceptions.Count -gt 0) {
    # If we have some user exceptions create one big regex to filter against later
    $ExceptionMatches = @($UserExceptions | Foreach {[regex]::Escape($_)})
    $Exceptions = ‘^(‘ + ($ExceptionMatches -join ‘|’) + ‘)$’

    # The regex escape will turn ‘*’ into ‘\*’, this next statment turns it into a match all regex of ‘.*’
    $Exceptions = $Exceptions -replace ‘\\\*’,’.*’
    else {
    # If there are no exceptions this will fail to match anything and thus allow all results to be processed.
    $Exceptions = ‘^()$’
    Write-Verbose “$($FunctionName): Exceptions regex string – $exceptions”

    How would you like for me to reference your work from my script? Is just a mention in the .Notes within my help block ok?

    The script I’m referring to is this one – https://raw.githubusercontent.com/zloeber/Powershell/master/Exchange/Get-MailboxFullAccessPermission.ps1

    Here’s my rendition:

    [string[]]$AdditionalFilteredUsers = @()
    Begin {

    $FilteredUsers = @(‘S-1-*’,
    “*\Discovery Management”,
    “*\Organization Management”,
    “*\Domain Admins”,
    “*\Enterprise Admins”,
    “*\Exchange Services”,
    “*\Exchange Trusted Subsystem”,
    “*\Exchange Servers”,
    “*\Exchange View-Only Administrators”,
    “*\Exchange Admins”,
    “*\Managed Availability Servers”,
    “*\Public Folder Administrators”,
    “*\Exchange Domain Servers”,
    “*\Exchange Organization Administrators”,
    $FilteredUsers += $AdditionalFilteredUsers
    $FilteredUsersString = @($FilteredUsers | ForEach-Object {[regex]::Escape($_)})
    $FilteredUsersString = ‘^(‘ + ($FilteredUsersString -join ‘|’) + ‘)$’
    $FilteredUsersString = $FilteredUsersString -replace ‘\\\*’,’.*’

    • 10:47 PM, 03/13/2017Zachary Loeber  / Reply

      I’m honored you found any of my work useful enough to cut apart and use for your own needs. Feel free to reference me or the github source in your notes if you like. But what I’d really like to see is a link to your completed/updated script in a repo with other work you do. Perhaps I can learn a few things from ya! 🙂

  3. 8:55 AM, 05/19/2016Ronny De Kesel  / Reply

    where can i find the latest version of the new-assetreport ?
    nice system report. noticed 2 problems : one showing 5 tasks above 100mb only 4 highlighted. second one, i tried printing the ‘troubleshooting version” but there seems some overlapping when printing.


  4. 1:40 PM, 01/25/2016Bryan  / Reply

    Hi Zachary,

    Love the script, it’s been a huge help! Any chance you could point me in the right direction?

    I’d like to modify the New-AssetReport.ps1 to perform the following –

    1) If we detect that it’s a VMware VM, connect to vSphere and gather the ESX host the VM is running on and add that to the system summary
    2) Again if we detect that it’s a VMware VM, add the ability to pull attributes and or tags of corresponding VM’s in vSphere and potentially add them to the system summary
    3) Add the ability to include the CN / object path of the computer object in the system summary?

    Again we appreciate all the effort you put into this excellent resource!


    • 1:44 PM, 01/25/2016Bryan  / Reply

      I forgot to mention, I have code that works well to connect to vSphere if PowerCLI is installed to pull attributes and tags:

      get-vm -name $name|foreach{$_.extensiondata.customattribute|Where{$_.key -like “attributeID”}|select value


  5. 7:56 AM, 12/08/2015Harald Bilke  / Reply

    Hi Zach,

    great work your “New-AssetReport”. Would it be a big Task to add a switch to OMIT all “Informational Messages” from the Output of the Event logs?

    Cheers HrY

    • 5:23 PM, 02/20/2016Zachary Loeber  / Reply

      Hey, sorry for the delayed response but there are -verbose flags which can be removed. I think you can even pass -verbose:$false to the script when run to force it if I remember correctly.

  6. 3:50 PM, 04/06/2015Jeff  / Reply

    Hey Zach, great work you’re doing here. I am using a few of your scripts and they are GREAT! quick question though on your New-AssetReport script. I am try to automate the report and save the Excel doc. Just wondering if there is an easy variable I’m missing…

    • 8:39 PM, 04/06/2015Zachary Loeber  / Reply

      Glad you like the scripts Jeff. I’m pretty certain I added the ability to export an excel spreadsheet at some point. You can use the -ReportFormat:Excel option I believe.

  7. 8:49 AM, 05/02/2014Jeremy Steger  / Reply

    I just wanted to say thanks for all this information than you’ve posted on this site. It’s very informative and I’ve gained some great knowledge from this. Keep it up!

  8. 9:47 PM, 04/11/2014Igor  / Reply

    Where is this New asset report ? cant find it. I need to create a html report of about 125 servers and I can sort by drive space remaining.

  9. 1:23 AM, 04/04/2014Karl  / Reply


    I am developing an internal use network assessment and inventory appliance and thought I would see what you have been using lately and your thoughts on a set and forget box that we could go get after a few days. The main focus being Asset inventory however perf monitoring and infrastructure is a plie

    • 3:17 PM, 04/04/2014Zachary Loeber  / Reply


      Although I’ve not updated my general appliance in a while I’ve become very fond of Observium for such tasks. I think they even have a prebuilt VM as well now.


  10. 4:01 PM, 02/25/2014Steve  / Reply

    Hi Zach,
    I’m going to give your updated method a shot now, thanks alot for an awesome script and the help, much appreciated! When you run this (yourself or others – I’m OK with Powershell, but still a ton to learn). Do you use this as a function or how do you run it? I did remove the back ticks, but I’m not sure if I it’s best to run this as the command you specified if I had to run it against a large number of servers? When you noted the “function part” on technet, do you use that part in a separate script and then call this one? Thanks again!


    • 8:25 PM, 02/25/2014Zachary Loeber  / Reply

      Steve, glad you are working through the process with me rather than just giving up and rating down the script on Technet 🙂

      Honestly, if you are looking for one specific bit of information from the report from a large number of systems I’d probably just use one of the multi-runspace functions in the script rather than using the whole thing. Regardless, the initial script was setup as just a function called new-assetreport that could be (and still can be) used to create system asset reports. I’ve since wrapped the whole file up with a set of simplified parameters so it can be called directly instead of having to futz around with coming up with the exact function parameter syntax. This prevents having to modify the script at all in most cases.

      Another item to note is that while the alternate credentials do work it will likely run faster and provide more results if you just run the script as an account with the required credentials for any domain joined systems.

      How many systems are you looking to report against? You may want to try the first run just generating troubleshooting sections instead of the full documentation to speed things up a bit (-ReportType Troubleshooting).

      Let me know how it goes,

  11. 11:08 AM, 02/25/2014Steve  / Reply

    Hi Zach – I just got this error now trying the new version, I am sure it’s my fault, I’m not clear on how to run it against 1 or more servers.
    I specified $Cred as a variable when I tried to run it, and the same for $Computers, then it seemed to launch when I ran .\new-assetreport -Computers $Computers, but then I get errors for all of these items:
    -AssetName : The term ‘-AssetName’ is not recognized as the name of a cmdlet, function, script file, or operable

  12. 10:40 AM, 02/25/2014Steve  / Reply

    Hi Zachary, Thanks for the fix on the script. I am trying to run it and I’m sure I’m doing something wrong. Should the list of computers be at the bottom of the script in the array you mentioned on the technet site?
    I wasn’t sure how to “run” this.
    Here’s what I tried adding to the bottom of the script

    $Servers = @(‘server1.domainname.com’,’server2.domainname.com’)
    $Cred = Get-Credential
    New-AssetReport -ReportContainer $SystemReport
    -AssetName $Servers
    -Credential $cred
    -OutputMethod ‘IndividualReport’ `
    -HTMLMode ‘DynamicGrid’

    • 11:52 AM, 02/25/2014Zachary Loeber  / Reply

      The examples I give in the script are all divided with backtick characters to make them more readable. You can run the script without even calling the New-AssetReport function directly. I’d comment out your additions at the end of the script then from a powershell prompt navigate to where the script is installed and run the following:

      $Servers = @(‘server1.domainname.com’,’server2.domainname.com’)
      ./New-AssetReport.ps1 -Computers $Servers -PromptForCredential -Verbose

      It seems like a bit of a pain but I’ve put so many features into the script I promise that this is probably the simplest method I could come up with. Thanks for your feedback btw, I’ve just uploaded a few more fixes so you should download the most recent version and try again if you do not mind.

  13. 3:02 PM, 02/24/2014Jason Martin  / Reply

    I am getting the following error trying to run your script.
    New-AssetReport : Cannot process argument transformation on parameter ‘SaveDataFile’. Cannot convert value “System.String” to type
    “System.Management.Automation.SwitchParameter”. Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.
    At C:\Scripts\New-AssetReport\New-AssetReport.ps1:13983 char:1
    + New-AssetReport @reportsplat
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (:) [New-AssetReport], ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,New-AssetReport

    • 10:03 PM, 02/24/2014Zachary Loeber  / Reply

      Jason, I replied to your post on the technet gallery. There was a minor fix to my most recent release I just uploaded. Give the newer version a try instead. That error should no longer be present.

  14. 3:41 PM, 02/19/2014Steve  / Reply

    Hi Zach,
    I’m trying to use your awesome new-asset report. However I can’t get it to run against a single server. I put this code at the bottom of the script, but I then get -verbose, -savedatafile, etc all as un-recognized commands. How should I run this report against either a single server, list of servers, or query AD for servers *excluding” desktops?

    $Servers = @(‘server1.domainname.com’,’server2.domainname.com’)
    $Cred = Get-Credential

    New-AssetReport -ReportContainer $SystemReport
    -AssetName $Servers

    -Credential $cred

    -OutputMethod ‘IndividualReport’ `
    -HTMLMode ‘DynamicGrid’

    • 8:41 PM, 02/19/2014Zachary Loeber  / Reply

      That should just work. What is the exact error that you receive? I just uploaded a newer version that I’ve been working earlier today as well. You may want to give that version a whirl.

      • 10:29 AM, 07/21/2014Jake  / Reply

        Hi Zach, I am trying to get this to work and running into the same issues as Steve did. This won’t run against any servers. I downloaded the script and then I am sure I’m just not filling in the parameters correctly, but can you tell me what I need to specify and where? Should I put the $Servers variable in the command line?
        I get an error trying to put the code Steve used and I don’t think it is supposed to go at the bottom of the script?

  15. 3:26 PM, 05/26/2012click  / Reply

    An insightful blog post right there mate . Thank you for the post .

  16. 7:53 AM, 04/08/2012Agueda Giessler  / Reply

    I really like your writing style, fantastic info, appreciate it for posting :D.

  17. 1:59 PM, 02/22/2012Rogelio  / Reply

    Excellent info in this site. Thanks.

  18. 2:24 AM, 08/16/2011BSA Scouts  / Reply

    Nice post, I love the website.

  19. 12:43 PM, 07/07/2011Andrew Chapman  / Reply

    Dear Zach,
    Our company is looking for a Windows Systems Administrator in the Chicagoland area. Experience in Business Critical Systems, SAN,NAS,UNIX. Any ideas greatly appreciated.
    Andrew Chapman 505 346 4919

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Pingbacks (0)

› No pingbacks yet.


Get every new post delivered to your Inbox

Join other followers