我在PowerShell中具有以下片段,该片段向我返回远程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字符串中做错了什么?
答案 0 :(得分:1)
这是一个有效的查询。我知道一件事... WQL的语法极其敏感且不容忍...特别是在空格和引号嵌套方面。有趣的是,大写/小写都可以:
using System.Management;
//....
var domainName = "YourDomainName";
var groupName = "Administrators";
var wql = string.Format
(
@"select partcomponent from win32_groupuser where groupcomponent='Win32_Group.Domain=""{0}"",Name=""{1}""'",
domainName,
groupName
);
foreach ( var thing in new ManagementObjectSearcher( wql ).Get( ) )
{
foreach ( var property in thing.Properties )
{
//--> And then, if you want the account object...
var path = new ManagementPath( property.Value as string );
var account = new ManagementObject( path );
foreach ( var acctProp in account.Properties )
{
Console.WriteLine( $"{acctProp.Name}={acctProp.Value}" );
}
}
}
编辑:仅出于讨厌,我添加了代码来获取引用的Win32_Account对象...因为partcomponent
的值是对该帐户对象的合格引用。
答案 1 :(得分:0)
由于您没有设置WHERE
子句,因此您的示例尚不清楚为什么它会失败。我最好的猜测是某些字符没有像应有的那样逃脱。
您还可以使用ORMi库为您的问题提供间接解决方案。您可以这样操作:
WMIHelper helper = new WMIHelper("root\\CimV2");
var users = helper.Query("SELECT * FROM Win32_GroupUser").ToList().Where(u => u.Contains("Win32_Group.Domain='MachineName',Name='administrators'"));