如何使用 power-shell 生成 sccm 报告?“在特定计算机上安装的软件”

如何使用 power-shell 生成 sccm 报告?“在特定计算机上安装的软件”

在 Sccm 中,通常我会按照以下方式使用 GUI 为 PC 生成“特定计算机上安装的软件”的报告。 在此处输入图片描述

然后输入电脑名称并单击查看报告。

在此处输入图片描述

我的问题是,

我正在尝试使用 powershell 通过登录 scccm 服务器来创建它https://blogs.technet.microsoft.com/enterprisemobility/2013/03/27/powershell-connecting-to-configuration-manager/

是否可以使用 powershell 生成上述报告?找不到任何合适的文档或教程来执行此操作。如能提供任何帮助,我将不胜感激!

附言: 我的目的是使用脚本生成安装在远程 PC 上的 /grab 软件。我使用 sccm 报告,因为 sccm 数据库已经存储了它,即使远程 PC 不在线,我们也可以生成报告而无需访问远程 PC。

答案1

您是否尝试通过运行 powershell 脚本通过电子邮件分发报告?SCCM 具有 SQL Server Reporting Services。SSRS 允许您订阅报告并通过电子邮件发送。如果您在报告中查看一些自定义数据,则需要在 SCCM 中创建自定义报告。

如果您仍想使用 powershell,则需要查询 SCCM 数据库。为此,您需要使用 SQLPS 模块并运行嵌入在内置报告中的查询或运行您自己的自定义查询。

安装SQL PS模块

希望这可以帮助!

答案2

我知道这已经是几年前的事情了,但我认为有一个更好的解决方案。您可以使用 PowerShell 运行任何 SSRS 报告,包括 SCCM 报告。

这里有关于这个话题的很好的一般性讨论:https://sqlbelle.wordpress.com/2015/08/17/automate-ssrs-report-generation-using-powershell/

下面是一个工作示例。请注意,Microsoft 报告查看器是先决条件,以下代码假定您在 c:\temp\SQLReportViewer 中拥有所需的包,当然还要插入您的 SSRS 服务器名称和要运行的报告的正确路径:

                $username = 'someuser'
                Write-Progress -Activity "Progress searching for $username" -status "Getting 'logged on user' report from SCCM"
 
                Try
                {
                    $version, $key = (Get-ChildItem C:\Windows\assembly\GAC_MSIL\Microsoft.ReportViewer.WinForms -ErrorAction Stop | Sort-Object name)[-1].Name -split '__'
                    Add-Type -AssemblyName "Microsoft.ReportViewer.WinForms, Version=$version, Culture=neutral, PublicKeyToken=$key" -ErrorAction Stop
                }
                Catch
                {
                    Write-Warning "`nFailed to load the required Microsoft ReportViewer Assembly"
                    Write-Warning 'Installing Microsoft Report Viewer 2015...'
                    #$install = Read-Host 'Install Microsoft Report Viewer 2015 (y/n)'
                    #if ($install -like "n*") { return }

                    msiexec.exe /passive /norestart /i c:\temp\SQLReportViewer\2015\SQLSysClrTypes.msi | Out-Null
                    msiexec.exe /passive /norestart /i c:\temp\SQLReportViewer\2015\ReportViewer.msi | Out-Null

                    Try
                    {
                        $version, $key = (Get-ChildItem C:\Windows\assembly\GAC_MSIL\Microsoft.ReportViewer.WinForms -ErrorAction Stop | Sort-Object name)[-1].Name -split '__'
                        Add-Type -AssemblyName "Microsoft.ReportViewer.WinForms, Version=$version, Culture=neutral, PublicKeyToken=$key" -ErrorAction Stop
                    }
                    Catch { Write-Error 'Still failed to load the required Microsoft ReportViewer Assembly'; Return }
                }

                $reportViewer = New-Object Microsoft.Reporting.WinForms.ReportViewer
                $reportViewer.ProcessingMode = "Remote"
                $reportViewer.ServerReport.ReportServerUrl = "http://<ssrs server>/reportserver"
                $reportViewer.ServerReport.ReportPath = "/Useful Reports/Master User List/Logon User report"

                $inputParams = @{
                    username = "%\$username"
                }

                #create an array based on how many incoming parameters
                $params = New-Object 'Microsoft.Reporting.WinForms.ReportParameter[]' $inputParams.Count
                $i = 0
                ForEach ($p In $inputParams.GetEnumerator())
                {
                    $params[$i] = New-Object Microsoft.Reporting.WinForms.ReportParameter($p.Name, $p.Value, $false)
                    $i++
                }

                $reportViewer.ServerReport.SetParameters($params)

                #required variables for rendering
                $mimeType = $null
                $encoding = $null
                $extension = $null
                $streamids = $null
                $warnings = $null

                #export to Excel
                Try
                {
                    $bytes = $reportViewer.ServerReport.Render("CSV", $null,
                        [ref]$mimeType,
                        [ref]$encoding,
                        [ref]$extension,
                        [ref]$streamids,
                        [ref]$warnings)
                }
                Catch
                {
                    'Failed to run the required SCCM report.'
                    Return
                }

                $csv = [System.Text.Encoding]::UTF8.GetString($bytes) -split '\n'


                #region start after first blank line which is where the column headers are defined
                $i = 0
                ForEach ($line In $csv)
                {
                    If ($line.trim() -eq "") { Break }
                    Else { $i++ }
                }

                $csv = $csv[($i + 1) .. $csv.count]
                #endregion start after first blank line

                $sessionsFromSCCM = ConvertFrom-Csv $csv

                $sessionsFromSCCM

相关内容