Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要使用C#代码执行SCCM任务序列的帮助吗_C#_Sccm - Fatal编程技术网

需要使用C#代码执行SCCM任务序列的帮助吗

需要使用C#代码执行SCCM任务序列的帮助吗,c#,sccm,C#,Sccm,我将以我对C#编码知之甚少作为序言。使用PowerShell、VBS等非常好,但我至少知道足够危险。我们有一个在机器上本地运行的C#程序。其目的是安装SCCM客户端并查找公布的任务序列。为了本演练的目的,假设将正确的任务序列部署到该机器所在的集合中-我知道不是这样-它启动If块是因为它找到了播发的TS 代码中还有很多其他东西,但下面是脚本中失败部分的要点。FWIW,这是在一个try/catch块中,TS名称是“Windows 10升级”。我甚至重新命名了TS,认为是其中的空格导致了它的失败。没有

我将以我对C#编码知之甚少作为序言。使用PowerShell、VBS等非常好,但我至少知道足够危险。我们有一个在机器上本地运行的C#程序。其目的是安装SCCM客户端并查找公布的任务序列。为了本演练的目的,假设将正确的任务序列部署到该机器所在的集合中-我知道不是这样-它启动If块是因为它找到了播发的TS

代码中还有很多其他东西,但下面是脚本中失败部分的要点。FWIW,这是在一个try/catch块中,TS名称是“Windows 10升级”。我甚至重新命名了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();
                }
localhost解析为计算机名,这很好。失败的部分是:

ManagementBaseObject outMPParams = wmiClass.InvokeMethod("ExecuteProgram", pkg, null);
现在,它完全脱离了try/catch块,出现了“TS not found”和其他错误。令人沮丧的是,我加载了一堆Write_日志条目,试图捕捉错误,但这一步很好地打破了它,直接进入了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-000000000022}” | out-null
然后我用这个来逗机器政策

Invoke-WMIMethod -Namespace root\ccm -Class SMS_CLIENT -Name TriggerSchedule “{00000000-0000-0000-0000-000000000021}” | out-null
稍等片刻,然后用以下方法对其进行评估:

$AllPackages = Get-WmiObject -Class ccm_program -Namespace root\ccm\ClientSDK 
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) {
然后ET给家里打电话

([wmiclass]'root\ccm\ClientSDK:CCM_ProgramsManager').ExecuteProgram($ProgramID, $PackageID)
这就是她写的。我会在一段时间内完成所有这些工作,一旦它启动,我就会立即离开

我有一个问题,如果还有人在看

如何从WMI调用返回结果?我试过这个

$RetVal=(([wmiclass]'root\ccm\ClientSDK:CCM_ProgramsManager').ExecuteProgram($ProgramID, $PackageID)).ExitCode
但它不喜欢它。该操作是否返回值


谢谢你的帮助

嗯,这不是我想要的答案,但我能够拼凑出一些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-000000000022}” | out-null
然后我用这个来逗机器政策

Invoke-WMIMethod -Namespace root\ccm -Class SMS_CLIENT -Name TriggerSchedule “{00000000-0000-0000-0000-000000000021}” | out-null
稍等片刻,然后用以下方法对其进行评估:

$AllPackages = Get-WmiObject -Class ccm_program -Namespace root\ccm\ClientSDK 
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) {
然后ET给家里打电话

([wmiclass]'root\ccm\ClientSDK:CCM_ProgramsManager').ExecuteProgram($ProgramID, $PackageID)
这就是她写的。我会在一段时间内完成所有这些工作,一旦它启动,我就会立即离开

我有一个问题,如果还有人在看

如何从WMI调用返回结果?我试过这个

$RetVal=(([wmiclass]'root\ccm\ClientSDK:CCM_ProgramsManager').ExecuteProgram($ProgramID, $PackageID)).ExitCode
但它不喜欢它。该操作是否返回值


谢谢你的帮助

看起来有点正确。在我看来,问题在于CCM_程序似乎没有任何方法,因此您无法调用任何方法。我从快速搜索中得到的信息是,您必须从CCM_程序中获取TS,然后使用CCM_ProgramsManager执行(请参阅:),因为这都是wmi,您说您擅长PS/VBS,我建议您先用您熟悉的语言编写,然后使用“端口”一般来说,还有一件事:TS不会有一个正确的名称(将是*),甚至PackageName也可能不是您所期望的,请使用一些WMIExplorer手动检查它到底是什么,以及如何正确识别它看起来有些正确。在我看来,问题在于CCM_程序似乎没有任何方法,因此您无法调用任何方法。我从快速搜索中得到的信息是,您必须从CCM_程序中获取TS,然后使用CCM_ProgramsManager执行(请参阅:),因为这都是wmi,您说您擅长PS/VBS,我建议您先用您熟悉的语言编写,然后使用“端口”通常还有一件事:TS不会有一个正确的名称(将是*),甚至PackageName也可能不是您所期望的,请使用一些WMIExplorer手动检查它到底是什么,以及如何正确识别它。ExecuteProgram(s)方法应返回值0表示成功,而非返回值0表示错误()。你认为它应该是exitcode的原因是什么?我认为wmi调用的标准返回值应该是一个名为ReturnValue的属性。但是,如果您只调用它而不指定任何属性(或者甚至不指定它只是查看stdout),您应该能够看到在您的情况下真正调用了什么。ExecuteProgram(s)方法应该返回值0表示成功,而不是返回值0表示错误()。你认为它应该是exitcode的原因是什么?我认为wmi调用的标准返回值应该是一个名为ReturnValue的属性。然而,如果您只是调用它而没有指定任何属性(或者甚至没有指定它只是观看stdout),那么您应该能够看到在您的案例中真正调用了什么。