forked from davidobrien1985/ConfigMgr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCM12ConvertApptoPKG.ps1
141 lines (106 loc) · 5.12 KB
/
CM12ConvertApptoPKG.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# .\CM12ConvertApptoPKG.ps1 -SiteCode DE0 -SMSProvider localhost -ApplicationName "DE_Microsoft_MBAMClient_2.1"
param (
[string]$SiteCode,
[string]$SMSProvider,
[string]$ApplicationName
)
function Get-ExecuteWqlQuery($siteServerName, $query)
{
$returnValue = $null
$connectionManager = New-Object Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine.WqlConnectionManager
if($connectionManager.Connect($siteServerName))
{
$result = $connectionManager.QueryProcessor.ExecuteQuery($query)
foreach($i in $result.GetEnumerator())
{
$returnValue = $i
break
}
$connectionManager.Dispose()
}
$returnValue
}
function Get-ApplicationObjectFromServer($appName,$siteServerName)
{
$resultObject = Get-ExecuteWqlQuery $siteServerName "select thissitecode from sms_identification"
$siteCode = $resultObject["thissitecode"].StringValue
$path = [string]::Format("\\{0}\ROOT\sms\site_{1}", $siteServerName, $siteCode)
$scope = New-Object System.Management.ManagementScope -ArgumentList $path
$query = [string]::Format("select * from sms_application where LocalizedDisplayName='{0}' AND ISLatest='true'", $appName.Trim())
$oQuery = New-Object System.Management.ObjectQuery -ArgumentList $query
$obectSearcher = New-Object System.Management.ManagementObjectSearcher -ArgumentList $scope,$oQuery
$applicationFoundInCollection = $obectSearcher.Get()
$applicationFoundInCollectionEnumerator = $applicationFoundInCollection.GetEnumerator()
if($applicationFoundInCollectionEnumerator.MoveNext())
{
$returnValue = $applicationFoundInCollectionEnumerator.Current
$getResult = $returnValue.Get()
$sdmPackageXml = $returnValue.Properties["SDMPackageXML"].Value.ToString()
[Microsoft.ConfigurationManagement.ApplicationManagement.Serialization.SccmSerializer]::DeserializeFromString($sdmPackageXml)
}
}
function Load-ConfigMgrAssemblies()
{
$AdminConsoleDirectory = Split-Path $env:SMS_ADMIN_UI_PATH -Parent
$filesToLoad = "Microsoft.ConfigurationManagement.ApplicationManagement.dll","AdminUI.WqlQueryEngine.dll", "AdminUI.DcmObjectWrapper.dll"
Set-Location $AdminConsoleDirectory
[System.IO.Directory]::SetCurrentDirectory($AdminConsoleDirectory)
foreach($fileName in $filesToLoad)
{
$fullAssemblyName = [System.IO.Path]::Combine($AdminConsoleDirectory, $fileName)
if([System.IO.File]::Exists($fullAssemblyName ))
{
$FileLoaded = [Reflection.Assembly]::LoadFrom($fullAssemblyName )
}
else
{
Write-Output ([System.String]::Format("File not found {0}",$fileName )) -backgroundcolor "red"
}
}
}
# The move-Package function is optional
Function Move-Package
{
$ParentFolder = Get-WmiObject -Class SMS_ObjectContainerNode -Namespace root\SMS\Site_$($SiteCode) -Filter "ObjectType = 2 AND Name = 'DE'"
$TargetFolder = Get-WmiObject -Class SMS_ObjectContainerNode -Namespace root\SMS\Site_$($SiteCode) -Filter "ObjectType = 2 AND Name = 'Task Sequence' AND ParentContainerNodeID = '$($ParentFolder.ContainerNodeID)'"
$Params = ([wmiclass]"\\$($SMSProvider)\root\sms\site_$($SiteCode):SMS_ObjectContainerItem").psbase.GetMethodParameters("MoveMembers")
$Params.ObjectType = 2
$Params.ContainerNodeID = 0
$Params.TargetContainerNodeID = $TargetFolder.ContainerNodeID
$Params.InstanceKeys = $Package.PackageID
([wmiclass]"\\$($SMSProvider)\root\sms\site_$($SiteCode):SMS_ObjectContainerItem").psbase.InvokeMethod("MoveMembers",$Params,$null)
}
$LocBefore = $null
$LocBefore = Get-Location
Load-ConfigMgrAssemblies
Set-Location "$($SiteCode):"
$application = [wmi](Get-WmiObject SMS_Application -Namespace root\sms\site_$($SiteCode) | where {($_.LocalizedDisplayName -eq "$($ApplicationName)") -and ($_.IsLatest)}).__PATH
$global:applicationXML = Get-ApplicationObjectFromServer "$($ApplicationName)" $SMSProvider
if ($applicationXML.DeploymentTypes -ne $null)
{
foreach ($a in $applicationXML.DeploymentTypes)
{
$a
$InstallCommandLine = $a.Installer.InstallCommandLine
$ContentPath = $a.Installer.Contents[0].Location
}
}
<#
if (Get-CMPackage -Name "$($ApplicationName)")
{
Write-Output "Package already exists"
Set-Location $LocBefore
exit
}
New-CMPackage -Name "$($ApplicationName)" -Path $ContentPath
New-CMProgram -PackageName "$($ApplicationName)" -StandardProgramName "Install $($ApplicationName)" -RunMode RunWithAdministrativeRights -UserInteraction $false -RunType Hidden -ProgramRunType WhetherOrNotUserIsLoggedOn -CommandLine $InstallCommandLine
$Package = Get-CMPackage -Name "$($ApplicationName)"
$Program = Get-WmiObject -Class sms_program -Namespace root\sms\site_$SiteCode -Filter "PackageID = '$($Package.PackageID)'"
if (-not ($Program.ProgramFlags -band 0x00000001))
{
$Program.ProgramFlags = $Program.ProgramFlags -bxor 0x00000001
$Program.put()
}
#Move-Package
#>
Set-Location $LocBefore