从 C# 中的 REST API 连接到 SCCM 服务器

问题描述 投票:0回答:1

这是我的第一个问题。我是 SCCM 连接的新手,所以我真的不知道发生了什么。我参考了以下程序集:

using Microsoft.ConfigurationManagement.ManagementProvider;
using Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine;

我(大致)使用以下代码:

WqlConnectionManager manager = new WqlConnectionManager(new SmsNamedValuesDictionary());
manager.Connect("myServerName");

如果我在 C# .NET 控制台应用程序上运行此代码,一切都会顺利进行。如果我在 .NET Core 上开发的 Rest API 上运行它,它会抛出异常

无法加载程序集 System.Windows.Forms

我不知道为什么需要这样的组装,但情况就是这样。

要记住两件事:

  1. 该代码属于我工作的公司,因此我没有机会发布更多代码或屏幕截图。

  2. 当前项目强制要求使用从 Web 门户调用的 API。

那么,有两个问题:

  1. 为什么它可以在控制台应用程序上运行,但不能在 Rest API 上运行?
  2. 是否建议以这种方式连接到 SCCM 服务器?

谢谢。

我从当前正在使用的 WinForms 应用程序中复制粘贴了一些代码,零问题。我本来希望能正常连接到 SCCM 服务器。

c# api .net-core sccm
1个回答
0
投票

我目前正在使用 C# 连接到 SCCM REST API 以唤醒机器。正如我在上面的评论中提到的,使用默认凭据连接失败,因此需要发送用户 ID 和密码。

    public bool Wake()
    {
        if (!string.IsNullOrEmpty(computerName))
        {
            ConnectionOptions options = new ConnectionOptions();
            options.Username = userId;
            options.Password = password;
            options.Impersonation = ImpersonationLevel.Impersonate;
            options.EnablePrivileges = true;
            ManagementScope ms = new ManagementScope($"\\\\{siteServer}\\root\\SMS\\Site_SW1", options);

            SetResourceId(ms);
            ManagementBaseObject returnVal = ExecuteWithPassword(ms);

            if (returnVal == null)
            {
                return false;
            }
            else if (Convert.ToInt32(returnVal["numsleepers"]) >= 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else 
        { 
            return false; 
        }
    }

后续代码使用作用域来执行查询:

private void SetResourceId(ManagementScope ms)
{
    if (!string.IsNullOrEmpty(computerName))
    {
        var searcher = new ManagementObjectSearcher($"\\\\{siteServer}\\Root\\SMS\\Site_SW1", $"Select ResourceID from SMS_R_System Where NetBiosName = '{computerName}'")
        {
            Scope = ms
        };

        string ResourceID = searcher
            .Get()
            .Cast<ManagementObject>()
            .First()
            .Properties["ResourceID"].Value.ToString();

        if (!string.IsNullOrEmpty(ResourceID))
        {
            resourceId = ResourceID;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.