Powershell: Get Office Software



  • I can run this just fine and it screen outputs like a champ

    Get-Content -Path c:\scripts\Computers.txt | ForEach-Object {Get-WmiObject -Class Win32_Product -ComputerName $_} |  Format-Table Name,Vendor,Version,Caption,LocalPackage
    

    Then when I add:
    Get-Content -Path c:\scripts\Computers.txt | ForEach-Object {Get-WmiObject -Class Win32_Product -ComputerName $} | Format-Table Name,Vendor,Version,Caption,LocalPackage |Where-Object -FilterScript {$.Name -like "Microsoft Office*"}
    To only find Microsoft Office, it just completes and does no screen output

    Get-Content -Path c:\scripts\Computers.txt | ForEach-Object {Get-WmiObject -Class Win32_Product -ComputerName $_} | Format-Table Name,Vendor,Version,Caption,LocalPackage | Export-CSV -NoTypeInformation "C:\scripts\installed.csv";
    This returns a file with just guid only or blank in testing

    Trying to run this in an AD domain to get Microsoft Office installs and versions for prep of a O365 migration.
    So I would like the format of the top one formatted into CSV and remove the other crap and just list me "Microsoft Office*"



  • Could you put your code in via the form that removes all the markup? It's messing with my ability to help ya.



  • Once I figure out how


  • Service Provider

    @Texkonc said in Powershell: Get Office Software:

    Once I figure out how

    Just start a line with four spaces.

    Or use back ticks, three of them, on the line before and after the code.



  • This post is deleted!


  • @scottalanmiller said in Powershell: Get Office Software:

    @Texkonc said in Powershell: Get Office Software:

    Once I figure out how

    Just start a line with four spaces.

    Or use back ticks, three of them, on the line before and after the code.

    No Dice
    and What?



  • Get-Content -Path c:\scripts\Computers.txt | ForEach-Object {Get-WmiObject -Class Win32_Product -ComputerName $_} |  Format-Table Name,Vendor,Version,Caption,LocalPackage
    Get-Content -Path c:\scripts\Computers.txt | ForEach-Object {Get-WmiObject -Class Win32_Product -ComputerName $_} |  Format-Table Name,Vendor,Version,Caption,LocalPackage |Where-Object -FilterScript {$_.Name -like "*Microsoft Office**"} 
    Get-Content -Path c:\scripts\Computers.txt | ForEach-Object {Get-WmiObject -Class Win32_Product -ComputerName $_} |  Format-Table Name,Vendor,Version,Caption,LocalPackage
    

    or

    Get-Content -Path c:\scripts\Computers.txt | ForEach-Object {Get-WmiObject -Class Win32_Product -ComputerName $_} | Format-Table Name,Vendor,Version,Caption,LocalPackage

    Get-Content -Path c:\scripts\Computers.txt | ForEach-Object {Get-WmiObject -Class Win32_Product -ComputerName $_} | Format-Table Name,Vendor,Version,Caption,LocalPackage |Where-Object -FilterScript {$_.Name -like "*Microsoft Office**"}

    Get-Content -Path c:\scripts\Computers.txt | ForEach-Object {Get-WmiObject -Class Win32_Product -ComputerName $_} | Format-Table Name,Vendor,Version,Caption,LocalPackage | Export-CSV -NoTypeInformation "C:\scripts\installed.csv";



  • Hi
    Have you looked at this.
    https://msdn.microsoft.com/en-us/library/bb977556.aspx
    MAP
    THis seems to be a tool from MS that does what you want.


  • Service Provider

    @Texkonc said in Powershell: Get Office Software:

    @scottalanmiller said in Powershell: Get Office Software:

    @Texkonc said in Powershell: Get Office Software:

    Once I figure out how

    Just start a line with four spaces.

    Or use back ticks, three of them, on the line before and after the code.

    No Dice
    and What?

    How did it not work? Just put four spaces in front of your code.


  • Service Provider

    I just did it as an example. You can't have it still tied to the line above, you need to hit enter to separate it. The way that you had it, it was four spaces between that line and the line before, it wasn't a line on its own yet.



  • I'm not sure of your end goal, so this way of querying the office version may not suit your needs... but here it is anyways:

    I query the registry to find the version of office on a PC in some scripts:

    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\O365ProPlusRetail - en-us" /v DisplayVersion
    
    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\O365ProPlusRetail - en-us" /v DisplayName
    

    And if you like to get dirty:

    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /f *Office*


  • @momurda
    I just tried using the MAP toolkit from MS as i thought it would be a useful inventory tool. You know, since MS makes their money selling software, you would think they would make a tool that would let you inventory their software and tell you license info.
    It is just another half assed .exe from MS that really does nothing useful.
    It tells you how many pcs you have that are 'ready' for a certain product, not what is currently installed, no license keys, nothing useful.
    Seriously what is the point of this?



  • @momurda said in Powershell: Get Office Software:

    @momurda
    I just tried using the MAP toolkit from MS as i thought it would be a useful inventory tool. You know, since MS makes their money selling software, you would think they would make a tool that would let you inventory their software and tell you license info.
    It is just another half assed .exe from MS that really does nothing useful.
    It tells you how many pcs you have that are 'ready' for a certain product, not what is currently installed, no license keys, nothing useful.
    Seriously what is the point of this?

    Shocker...


  • Service Provider

    @momurda said in Powershell: Get Office Software:

    @momurda
    I just tried using the MAP toolkit from MS as i thought it would be a useful inventory tool. You know, since MS makes their money selling software, you would think they would make a tool that would let you inventory their software and tell you license info.
    It is just another half assed .exe from MS that really does nothing useful.
    It tells you how many pcs you have that are 'ready' for a certain product, not what is currently installed, no license keys, nothing useful.
    Seriously what is the point of this?

    Making licensing easy makes it hard to oversell.



  • @Tim_G said in Powershell: Get Office Software:

    And if you like to get dirty:

    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /f *Office*
    

    The best one, but need to run it against remote machines. Issue with this one, is not all machines might not have remote registry on. Hence a WMI call is better.



  • @Texkonc said in Powershell: Get Office Software:

    @Tim_G said in Powershell: Get Office Software:

    And if you like to get dirty:

    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /f *Office*
    

    The best one, but need to run it against remote machines. Issue with this one, is not all machines might not have remote registry on. Hence a WMI call is better.

    You do something like this.

    Invoke-Command -ComputerName HOSTNAME -Credential domain\username `
    -ScriptBlock {
    cmd /k reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /f Office
    }



  • @black3dynamite said in Powershell: Get Office Software:

    @Texkonc said in Powershell: Get Office Software:

    @Tim_G said in Powershell: Get Office Software:

    And if you like to get dirty:

    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /f *Office*
    

    The best one, but need to run it against remote machines. Issue with this one, is not all machines might not have remote registry on. Hence a WMI call is better.

    You do something like this.

    Invoke-Command -ComputerName HOSTNAME -Credential domain\username `
    -ScriptBlock {
    cmd /k reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /f Office
    }

    I have about 50 machines, I am not going to enter the host name everytime, I need it to pull from a list.



  • I spent a decent amount of time on this out of curiosity and finally got something together that I actually tested with various domain PCs, and works:

    $computers = Get-Content -Path C:\computers.txt
    ForEach ($computer in $computers)
    {
        Invoke-Command -ComputerName $computer -ErrorAction SilentlyContinue {Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Where-Object {$_.DisplayName -like '*Microsoft Office*'} | Export-CSV -NoTypeInformation "C:\test.csv"}
    }
    

    I suppose you can figure out how to change it to what will work in your environment if you have issues connecting to computers. This should get you going.



  • That is a great script.
    I ran it on a 2012 nonR2 and a 2008R2, and my desktop win10. I can not get it to write the output to a file on any of the 3. If I comment out the output to a file, it screen prints fine.



  • Try this.

    $computers = Get-Content -Path C:\computers.txt
    ForEach ($computer in $computers)
    {
        $results = Invoke-Command -ComputerName $computer -ErrorAction SilentlyContinue {
        Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* -ErrorAction SilentlyContinue | `
        Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | `
        Where-Object {$_.DisplayName -like '*Microsoft Office*'}
        }
     $results | Export-Csv -NoTypeInformation -Path "C:\test.csv"
    }


  • @black3dynamite said in Powershell: Get Office Software:

    $computers = Get-Content -Path C:\computers.txt
    ForEach ($computer in $computers)
    {
    $results = Invoke-Command -ComputerName $computer -ErrorAction SilentlyContinue {
    Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall* -ErrorAction SilentlyContinue | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
    Where-Object {$_.DisplayName -like 'Microsoft Office'}
    }
    $results | Export-Csv -NoTypeInformation -Path "C:\test.csv"
    }

    That creates the file, but the file ends up blank



  • @Tim_G said in Powershell: Get Office Software:

    I spent a decent amount of time on this out of curiosity and finally got something together that I actually tested with various domain PCs, and works:

    $computers = Get-Content -Path C:\computers.txt
    ForEach ($computer in $computers)
    {
        Invoke-Command -ComputerName $computer -ErrorAction SilentlyContinue {Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Where-Object {$_.DisplayName -like '*Microsoft Office*'} | Export-CSV -NoTypeInformation "C:\test.csv"}
    }
    

    I suppose you can figure out how to change it to what will work in your environment if you have issues connecting to computers. This should get you going.

    The test.csv file ends up showing up on each computer.



  • @black3dynamite said in Powershell: Get Office Software:

    @Tim_G said in Powershell: Get Office Software:

    I spent a decent amount of time on this out of curiosity and finally got something together that I actually tested with various domain PCs, and works:

    $computers = Get-Content -Path C:\computers.txt
    ForEach ($computer in $computers)
    {
        Invoke-Command -ComputerName $computer -ErrorAction SilentlyContinue {Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Where-Object {$_.DisplayName -like '*Microsoft Office*'} | Export-CSV -NoTypeInformation "C:\test.csv"}
    }
    

    I suppose you can figure out how to change it to what will work in your environment if you have issues connecting to computers. This should get you going.

    The test.csv file ends up showing up on each computer.

    Yeah change the path to a network location.



  • @Texkonc said in Powershell: Get Office Software:

    @black3dynamite said in Powershell: Get Office Software:

    $computers = Get-Content -Path C:\computers.txt
    ForEach ($computer in $computers)
    {
    $results = Invoke-Command -ComputerName $computer -ErrorAction SilentlyContinue {
    Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall* -ErrorAction SilentlyContinue | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
    Where-Object {$_.DisplayName -like 'Microsoft Office'}
    }
    $results | Export-Csv -NoTypeInformation -Path "C:\test.csv"
    }

    That creates the file, but the file ends up blank

    You need to include the stars on each side of 'Microsoft Office'



  • I made a few changes, mainly appending data output to a central CSV file:

    $computers = Get-Content -Path "C:\computers.txt"
    ForEach ($computer in $computers)
    {
        Invoke-Command -ComputerName $computer -ErrorAction SilentlyContinue -ScriptBlock {Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Where-Object {$_.DisplayName -like '*Microsoft Office*'} | Export-CSV -NoTypeInformation -Append -Path "\\YOURCOMPUTER\c$\test.csv"}
    }
    


  • @Tim_G said in Powershell: Get Office Software:

    @Texkonc said in Powershell: Get Office Software:

    @black3dynamite said in Powershell: Get Office Software:

    $computers = Get-Content -Path C:\computers.txt
    ForEach ($computer in $computers)
    {
    $results = Invoke-Command -ComputerName $computer -ErrorAction SilentlyContinue {
    Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall* -ErrorAction SilentlyContinue | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
    Where-Object {$_.DisplayName -like 'Microsoft Office'}
    }
    $results | Export-Csv -NoTypeInformation -Path "C:\test.csv"
    }

    That creates the file, but the file ends up blank

    You need to include the stars on each side of 'Microsoft Office'

    Nevermind, the website uses it as italics.


  • Service Provider

    @Tim_G said in Powershell: Get Office Software:

    @Tim_G said in Powershell: Get Office Software:

    @Texkonc said in Powershell: Get Office Software:

    @black3dynamite said in Powershell: Get Office Software:

    $computers = Get-Content -Path C:\computers.txt
    ForEach ($computer in $computers)
    {
    $results = Invoke-Command -ComputerName $computer -ErrorAction SilentlyContinue {
    Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall* -ErrorAction SilentlyContinue | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
    Where-Object {$_.DisplayName -like 'Microsoft Office'}
    }
    $results | Export-Csv -NoTypeInformation -Path "C:\test.csv"
    }

    That creates the file, but the file ends up blank

    You need to include the stars on each side of 'Microsoft Office'

    Nevermind, the website uses it as italics.

    Escape them with a backslash

    You need to include the stars on each side of '*Microsoft Office*'

    or put them in single backticks.
    You need to include the stars on each side of '*Microsoft Office*'
    0_1494560735860_upload-902947ef-5a28-4d7c-a63b-dad58fc57665



  • This one fit my needs for now.
    ///
    Get-Content -Path c:\scripts\Computers.txt | ForEach-Object {Get-WmiObject -Class Win32_Product -ComputerName $} | select-object PSComputerName,Name,Vendor,Version | Where-Object {$.Name -like "Microsoft Office"} | out-file c:\scripts\installed.txt
    ///



  • Get-Content -Path c:\scripts\Computers.txt | ForEach-Object {Get-WmiObject -Class Win32_Product -ComputerName $_} | select-object PSComputerName,Name,Vendor,Version | Where-Object {$_.Name -like "*Microsoft Office*"} | Format-Table PSComputerName,Name,Vendor,Version -Wrap -Auto | out-file c:\scripts\installed.txt
    

    Updated. Management Framework 3 or higher required


Log in to reply
 

Looks like your connection to MangoLassi was lost, please wait while we try to reconnect.