这是我的第一个问题。我是 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
我不知道为什么需要这样的组装,但情况就是这样。
要记住两件事:
该代码属于我工作的公司,因此我没有机会发布更多代码或屏幕截图。
当前项目强制要求使用从 Web 门户调用的 API。
那么,有两个问题:
谢谢。
我从当前正在使用的 WinForms 应用程序中复制粘贴了一些代码,零问题。我本来希望能正常连接到 SCCM 服务器。
我目前正在使用 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;
}
}
}