需要帮助使用 C# 代码执行 SCCM 任务序列
Need help using C# code to execute SCCM Task Sequence
我将以我对 C# 编码知之甚少作为序言。 PowerShell、VBS 等非常好。但我至少知道足够危险。我们有一个在机器上本地运行的 C# 程序。其目的是安装 SCCM 客户端并查找公布的任务序列。出于本练习的目的,假设将正确的任务序列部署到该机器所在的集合中——我知道不是这样——它启动 If 块,因为它找到了通告的 TS。
代码中还有很多其他内容,但这是脚本失败部分的主要内容。 FWIW,这是在 try/catch 块中,TS 名称是“Windows 10 Upgrade”。我什至重命名了 TS,认为是其中的空格导致它失败。不开心。
ManagementScope scope = new ManagementScope(@"\localhost\ROOT\ccm\clientsdk");
ObjectQuery query = new ObjectQuery("SELECT * FROM CCM_Program");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
Write_Log("Searching for Policy");
ManagementObjectCollection allpackages = searcher.Get();
foreach (ManagementObject pkg in allpackages)
{
Write_Log(pkg["PackageName"].ToString());
if (pkg["PackageName"].ToString() == "Windows 10 Upgrade")
{
Write_Log("Found:" + pkg["PackageName"].ToString());
Write_Log("About to execute WMI Invoke for pkg: " + pkg);
ManagementClass wmiClass = new managementClass(@"\localhost\ROOT\ccm\clientSDK:CCM_ProgramsManager");
ManagementBaseObject outMPParams = wmiClass.InvokeMethod("ExecuteProgram", pkg, null);
Write_Log("ExecuteProgram Result: " + outMPParams["ReturnValue"].ToString());
if (outMPParams["ReturnValue"].ToString() == "0")
Write_Log("SCCM TS Started");
Application.Exit();
}
本地主机被解析为计算机名称,这样很好。失败的部分是:
ManagementBaseObject outMPParams = wmiClass.InvokeMethod("ExecuteProgram", pkg, null);
现在它完全脱离了 try/catch 块,出现“未找到 TS”并且没有其他错误。令人沮丧的是,我加载了一堆 Write_log 条目以尝试捕获错误是什么,但是那一步真的很好地打破了它并直接进入了 catch 块。
有人有使用 C# 执行 SCCM 相关任务的经验吗?上面的语法看起来正确吗?
就像我说的,我从另一家公司继承了代码,并试图让它为我们工作。我只是对这个电话了解不够,在网上找不到任何关于它试图做什么的信息。
非常感谢任何帮助!!
好吧,这不是我要找的答案,但我能够拼凑一些 PS 代码来满足我的需要。首先我查询有哪些可用的包:
$AllPackages = Get-WmiObject -Class ccm_program -Namespace root\ccm\ClientSDK
然后我用这个
逗弄机器策略
Invoke-WMIMethod -Namespace root\ccm -Class SMS_CLIENT -Name TriggerSchedule “{00000000-0000-0000-0000-000000000021}” | out-null
稍等一下,然后用这个来评估它:
Invoke-WMIMethod -Namespace root\ccm -Class SMS_CLIENT -Name TriggerSchedule “{00000000-0000-0000-0000-000000000022}” | out-null
然后我执行 ForEach 循环以获取我获得的信息:
ForEach ($Pkg in $AllPackages) {
$PackageID = $Pkg.PackageID
$ProgramID = $Pkg.ProgramID
$PackageName = $Pkg.PackageName
if ($PackageName -eq $TSName) {
然后外星人用
打电话回家
([wmiclass]'root\ccm\ClientSDK:CCM_ProgramsManager').ExecuteProgram($ProgramID, $PackageID)
这就是她写的全部内容。我在一个 While 块中完成所有这些工作,并在它启动后立即退出。
如果有人还在看,我有一个问题...
如何从 WMI 调用中获取返回结果?我试过这个
$RetVal=(([wmiclass]'root\ccm\ClientSDK:CCM_ProgramsManager').ExecuteProgram($ProgramID, $PackageID)).ExitCode
但它不喜欢它。该操作是否 return 有价值?
感谢您的帮助!
我将以我对 C# 编码知之甚少作为序言。 PowerShell、VBS 等非常好。但我至少知道足够危险。我们有一个在机器上本地运行的 C# 程序。其目的是安装 SCCM 客户端并查找公布的任务序列。出于本练习的目的,假设将正确的任务序列部署到该机器所在的集合中——我知道不是这样——它启动 If 块,因为它找到了通告的 TS。
代码中还有很多其他内容,但这是脚本失败部分的主要内容。 FWIW,这是在 try/catch 块中,TS 名称是“Windows 10 Upgrade”。我什至重命名了 TS,认为是其中的空格导致它失败。不开心。
ManagementScope scope = new ManagementScope(@"\localhost\ROOT\ccm\clientsdk");
ObjectQuery query = new ObjectQuery("SELECT * FROM CCM_Program");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
Write_Log("Searching for Policy");
ManagementObjectCollection allpackages = searcher.Get();
foreach (ManagementObject pkg in allpackages)
{
Write_Log(pkg["PackageName"].ToString());
if (pkg["PackageName"].ToString() == "Windows 10 Upgrade")
{
Write_Log("Found:" + pkg["PackageName"].ToString());
Write_Log("About to execute WMI Invoke for pkg: " + pkg);
ManagementClass wmiClass = new managementClass(@"\localhost\ROOT\ccm\clientSDK:CCM_ProgramsManager");
ManagementBaseObject outMPParams = wmiClass.InvokeMethod("ExecuteProgram", pkg, null);
Write_Log("ExecuteProgram Result: " + outMPParams["ReturnValue"].ToString());
if (outMPParams["ReturnValue"].ToString() == "0")
Write_Log("SCCM TS Started");
Application.Exit();
}
本地主机被解析为计算机名称,这样很好。失败的部分是:
ManagementBaseObject outMPParams = wmiClass.InvokeMethod("ExecuteProgram", pkg, null);
现在它完全脱离了 try/catch 块,出现“未找到 TS”并且没有其他错误。令人沮丧的是,我加载了一堆 Write_log 条目以尝试捕获错误是什么,但是那一步真的很好地打破了它并直接进入了 catch 块。
有人有使用 C# 执行 SCCM 相关任务的经验吗?上面的语法看起来正确吗?
就像我说的,我从另一家公司继承了代码,并试图让它为我们工作。我只是对这个电话了解不够,在网上找不到任何关于它试图做什么的信息。
非常感谢任何帮助!!
好吧,这不是我要找的答案,但我能够拼凑一些 PS 代码来满足我的需要。首先我查询有哪些可用的包:
$AllPackages = Get-WmiObject -Class ccm_program -Namespace root\ccm\ClientSDK
然后我用这个
逗弄机器策略Invoke-WMIMethod -Namespace root\ccm -Class SMS_CLIENT -Name TriggerSchedule “{00000000-0000-0000-0000-000000000021}” | out-null
稍等一下,然后用这个来评估它:
Invoke-WMIMethod -Namespace root\ccm -Class SMS_CLIENT -Name TriggerSchedule “{00000000-0000-0000-0000-000000000022}” | out-null
然后我执行 ForEach 循环以获取我获得的信息:
ForEach ($Pkg in $AllPackages) {
$PackageID = $Pkg.PackageID
$ProgramID = $Pkg.ProgramID
$PackageName = $Pkg.PackageName
if ($PackageName -eq $TSName) {
然后外星人用
打电话回家([wmiclass]'root\ccm\ClientSDK:CCM_ProgramsManager').ExecuteProgram($ProgramID, $PackageID)
这就是她写的全部内容。我在一个 While 块中完成所有这些工作,并在它启动后立即退出。
如果有人还在看,我有一个问题...
如何从 WMI 调用中获取返回结果?我试过这个
$RetVal=(([wmiclass]'root\ccm\ClientSDK:CCM_ProgramsManager').ExecuteProgram($ProgramID, $PackageID)).ExitCode
但它不喜欢它。该操作是否 return 有价值?
感谢您的帮助!