【问题标题】:C# Equivalent of this powershell snippet此 powershell 片段的 C# 等效项
【发布时间】: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 并以这种方式获得结果。

标签: c# wmi


【解决方案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 的值是对该帐户对象的限定引用。

【讨论】:

    【解决方案2】:

    由于您没有设置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'"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      相关资源
      最近更新 更多