【发布时间】:2019-01-03 22:59:27
【问题描述】:
我在 PowerShell 中有以下 sn-p,它返回了我需要的远程 PC 上本地管理员的信息。我正在尝试将此代码转换为 c#,但一直运气不佳。
$ADMINS = get-wmiobject -computername $computername -Credential $Credential -query "select * from win32_groupuser where GroupComponent=""Win32_Group.Domain='$computername',Name='administrators'""" | % {$_.partcomponent}
我能够在 c# 中获得一个基本的 wmi 查询,如下所示: 方法
public IEnumerable<CimInstance> WmiQuerier(CimSession session , string wmiquery)
{
try
{
string Namespace = @"root\cimv2";
IEnumerable<CimInstance> CimInstances = new List<CimInstance>();
CimInstances = session.QueryInstances(Namespace, "WQL", wmiquery);
//IEnumerable<CimInstance> CimInstances2 = CimInstances.SelectMany()
return CimInstances;
}
catch (Exception ex )
{
Console.WriteLine(ex.Message);
throw;
}
测试
[Test]
public void CimQuery()
{
string querystring = "SELECT * FROM win32_groupuser";
Wmi wmi = new Wmi();
NetworkCredential mynetcred = new NetworkCredential("Domain\\User", "Password%");
CimCredential mycimCred = wmi.ConvertCred(mynetcred);
CimSession mySession = wmi.WmiConnection(testcomp, mycimCred);
IEnumerable<CimInstance> querierResults = wmi.WmiQuerier(mySession, querystring).Take(5).ToList();
Assert.IsInstanceOf<IEnumerable<CimInstance>>(querierResults);
}
}
但是,当我尝试像在 powershell 代码中那样添加任何类型的 Where 子句时,(请参阅下面的尝试)
"SELECT * FROM win32_groupuser Where GroupComponent = \"Win32_Group.Domain='MachineName',Name='administrators' \""
我得到了错误
Microsoft.Management.Infrastructure.CimException: 'WS 管理 服务无法处理该请求。 WQL 查询无效。 '
我在 WQL 字符串中做错了什么?
【问题讨论】:
-
可能不是原因,但你的空格在这两种情况下是不同的
-
您可以从 c# 调用 powershell 并以这种方式获得结果。