一、为什么需要PowerShell与SCCM集成
在企业IT管理中,软件分发是个让人头疼的活儿。想象一下,你需要在几百台电脑上安装同一个软件,手动操作不仅费时费力,还容易出错。这时候,PowerShell和SCCM这对黄金搭档就派上用场了。
SCCM(System Center Configuration Manager)是微软自家的配置管理工具,擅长软件分发和系统管理。而PowerShell则是Windows平台的自动化利器。把它们俩结合起来,就像给IT管理员装上了自动化的翅膀。
举个例子,假设我们需要给销售部门的所有电脑部署最新的CRM客户端。传统方法可能要一台台手动安装,或者写个批处理脚本。但用PowerShell+SCCM的方案,几行代码就能搞定:
# 导入SCCM模块
Import-Module "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1"
# 设置SCCM站点位置
Set-Location "ABC:\"
# 创建应用程序对象
$App = New-CMApplication -Name "SalesCRM" -SoftwareVersion "2.1" -Publisher "Contoso"
# 添加部署类型
$DeploymentType = Add-CMScriptDeploymentType -ApplicationName "SalesCRM" -DeploymentTypeName "Install" -ContentLocation "\\server\share\CRM" -InstallCommand "setup.exe /silent" -ScriptLanguage "PowerShell" -ScriptText "Get-Process -Name 'oldCRM' | Stop-Process -Force"
# 部署到销售部门设备集合
Start-CMApplicationDeployment -Name "SalesCRM" -CollectionName "Sales Department" -DeployAction Install -DeployPurpose Required -UserNotification DisplayAll -AvailableDateTime (Get-Date)
这段代码做了几件事:首先加载SCCM模块,然后创建一个名为"SalesCRM"的应用程序,指定安装命令和静默参数,最后部署到销售部门的设备集合。注释清楚地解释了每一步的作用。
二、环境准备与基础配置
在开始玩转这个组合之前,得先把环境搭好。就像做饭前要备好食材和厨具一样,这里也需要做些准备工作。
首先,确保你的SCCM环境已经就绪。需要安装最新版的SCCM Current Branch,并且管理员控制台要装在你打算运行PowerShell脚本的工作站上。另外,别忘了安装Windows ADK(评估和部署工具包),这是SCCM打包软件时的好帮手。
PowerShell方面,建议使用5.1或更高版本。SCCM自带了一个特殊的PowerShell模块,路径通常在这里:"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1"。每次使用前都需要导入这个模块。
这里有个小技巧,可以把这个导入命令放到你的PowerShell配置文件中,这样每次打开PowerShell时都会自动加载SCCM模块:
# 将以下内容添加到 $PROFILE 文件中
$SCCMModulePath = "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1"
if (Test-Path $SCCMModulePath) {
Import-Module $SCCMModulePath
Write-Host "SCCM模块已自动加载" -ForegroundColor Green
}
还有个重要设置是SCCM站点的驱动器映射。SCCM使用特殊的PSDrive来管理站点,通常用站点代码作为驱动器名。比如你的站点代码是ABC,就可以这样设置:
# 创建SCCM PSDrive
New-PSDrive -Name "ABC" -PSProvider "AdminUI.PS.Provider\CMSite" -Root "localhost" -Description "SCCM Site Drive"
# 切换到该驱动器
Set-Location "ABC:\"
三、核心操作实战演练
现在环境准备好了,让我们进入实战环节。我会通过几个典型场景,展示PowerShell如何与SCCM配合完成自动化软件分发。
1. 应用程序创建与部署
假设我们要部署一个内部开发的工具"Contoso Reporter",这个工具需要静默安装,并且在安装前检查.NET Framework 4.8是否存在。
# 创建应用程序
$AppParams = @{
Name = "Contoso Reporter"
SoftwareVersion = "1.2"
Publisher = "Contoso IT"
Description = "内部报表生成工具"
}
$App = New-CMApplication @AppParams
# 添加部署类型
$DTParams = @{
ApplicationName = "Contoso Reporter"
DeploymentTypeName = "Silent Install"
ContentLocation = "\\fileserver\apps\ContosoReporter"
InstallCommand = "setup.exe /quiet /norestart"
ScriptLanguage = "PowerShell"
ScriptText = @"
# 检查.NET 4.8是否存在
if (-not (Test-Path "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full")) {
Write-Output ".NET Framework 4.8未安装"
exit 1
}
"@
}
Add-CMScriptDeploymentType @DTParams
# 部署到所有工作站
$DeployParams = @{
Name = "Contoso Reporter"
CollectionName = "All Workstations"
DeployAction = "Install"
DeployPurpose = "Required"
AvailableDateTime = (Get-Date).AddHours(1)
DeadlineDateTime = (Get-Date).AddDays(1)
}
Start-CMApplicationDeployment @DeployParams
这个例子展示了如何创建一个完整的应用程序部署,包括前置条件检查。ScriptText参数中的PowerShell脚本会在安装前执行,确保环境符合要求。
2. 批量处理软件更新
每个月微软都会发布补丁,手动部署太麻烦了。用PowerShell可以轻松实现自动化:
# 获取最近30天发布的Critical和Security更新
$Updates = Get-CMSoftwareUpdate -Fast -Criteria "DateReleased > '$(Get-Date).AddDays(-30)' and UpdateClassification in ('Critical Updates','Security Updates')"
# 创建软件更新组
$UpdateGroup = New-CMSoftwareUpdateGroup -Name "Patch Tuesday $(Get-Date -Format 'yyyy-MM')" -Updates $Updates
# 部署到生产服务器集合
$Deployment = Start-CMSoftwareUpdateDeployment -SoftwareUpdateGroupName $UpdateGroup.LocalizedDisplayName -CollectionName "Production Servers" -DeploymentType Required -VerbosityLevel OnlyErrorMessages -SendWakeUpPacket $true -TimeBasedOn LocalTime -AvailableTime (Get-Date) -DeadlineTime (Get-Date).AddDays(3)
这段代码自动筛选出最近30天的重要更新,打包成组,然后部署到生产服务器。TimeBasedOn参数确保部署时间基于本地时区,避免时区问题导致的混乱。
四、高级技巧与最佳实践
掌握了基础操作后,来看看一些能让你事半功倍的高级技巧。
1. 使用哈希表简化参数传递
PowerShell的哈希表功能可以让代码更整洁:
# 定义应用程序参数
$AppArgs = @{
Name = "Finance Tool"
SoftwareVersion = "3.5"
Publisher = "Contoso"
Description = "财务部门专用工具"
LocalizedApplicationName = "财务工具"
}
# 定义部署类型参数
$DTArgs = @{
ApplicationName = "Finance Tool"
DeploymentTypeName = "Silent Install"
ContentLocation = "\\fileserver\apps\Finance"
InstallCommand = "setup.exe /quiet"
UninstallCommand = "setup.exe /uninstall /quiet"
ScriptLanguage = "PowerShell"
}
# 创建应用程序和部署类型
$App = New-CMApplication @AppArgs
Add-CMScriptDeploymentType @DTArgs
这种方式不仅代码更易读,还方便复用和维护。
2. 处理依赖关系
很多软件有依赖项,比如需要特定的运行时库。SCCM可以很好地处理这种场景:
# 创建主应用程序
$MainApp = New-CMApplication -Name "Data Analyzer" -SoftwareVersion "2.0"
# 创建依赖应用程序(VC++运行库)
$Dependency = New-CMApplication -Name "VC++ 2019 Redistributable" -SoftwareVersion "14.28"
# 为主应用添加依赖关系
Add-CMDeploymentTypeDependency -ApplicationName "Data Analyzer" -DeploymentTypeName "Install" -DependencyApplicationName "VC++ 2019 Redistributable" -IsAutoInstall $true
这样部署"Data Analyzer"时,SCCM会自动先安装VC++运行库。
五、常见问题排查
即使是最佳实践,偶尔也会遇到问题。这里分享几个常见问题的解决方法。
1. 应用程序部署失败
如果部署失败,首先检查SCCM日志文件。关键日志包括:
- AppDiscovery.log:应用程序发现过程
- AppIntentEval.log:部署意图评估
- Execmgr.log:实际执行情况
也可以通过PowerShell获取详细的部署状态:
# 获取特定应用程序的部署状态
Get-CMApplicationDeploymentStatus -Name "Contoso Reporter" -CollectionName "All Workstations" |
Select-Object Device, UserName, LastStatusMessage, NumberOfErrors |
Sort-Object NumberOfErrors -Descending |
Format-Table -AutoSize
2. 内容分发问题
如果客户端收不到内容,可能是分发点配置问题。可以强制重新分发:
# 重新分发应用程序内容
Start-CMContentDistribution -ApplicationName "Contoso Reporter" -DistributionPointName "DP01.contoso.com" -UpdateDistributionPoints $true
六、安全注意事项
自动化虽好,但安全不能忽视。以下是几个关键点:
始终使用最小权限原则。为PowerShell脚本创建专门的SCCM管理账户,而不是直接用域管理员。
敏感信息如密码要加密处理。可以使用SCCM的内置密码功能:
# 创建安全字符串变量
$SecureString = ConvertTo-SecureString "MyPassword123" -AsPlainText -Force
# 在部署类型中使用
$DTParams = @{
ApplicationName = "Secure App"
DeploymentTypeName = "Install"
InstallCommand = "setup.exe /password:`$(`[System.Runtime.InteropServices.Marshal]::PtrToStringAuto(`[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString)))"
}
- 定期审计PowerShell脚本和SCCM部署,确保没有被篡改。
七、总结与展望
通过PowerShell与SCCM的集成,我们实现了软件分发的自动化,大大提高了IT管理效率。从简单的应用程序部署到复杂的依赖关系处理,这个组合都能胜任。
未来,随着Intune的普及,可以考虑将部分SCCM功能迁移到云上。但就目前而言,对于大型企业环境,SCCM仍然是软件分发的主力军。而PowerShell作为自动化工具,其地位只会越来越重要。
记住,自动化不是一蹴而就的。建议从小规模开始,逐步扩展。先自动化简单的任务,积累经验后再处理复杂场景。这样既能保证成功率,又能让团队逐步适应自动化的工作方式。
评论