C # Эквивалент этого фрагмента powershell - PullRequest
0 голосов
/ 04 января 2019

У меня есть приведенный ниже фрагмент в PowerShell, который возвращает мне информацию, необходимую для локальных администраторов на удаленном ПК.Я пытаюсь преобразовать этот код в C #, но мне очень не повезло с ним.

 $ADMINS = get-wmiobject -computername $computername -Credential $Credential -query "select * from win32_groupuser where GroupComponent=""Win32_Group.Domain='$computername',Name='administrators'""" | % {$_.partcomponent}

Я могу получить базовый wmi-запрос, работающий на c #, как показано ниже: Метод

 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

   [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);
        }
    }

Однако, когда я пытаюсь добавить любое условие Where, как у меня в коде powershell, (см. Мою попытку ниже)

"SELECT * FROM win32_groupuser Where GroupComponent = \"Win32_Group.Domain='MachineName',Name='administrators' \""

Я получаю ошибку

Microsoft.Management.Infrastructure.CimException: «Служба WS-Management не может обработать запрос.WQL-запрос недействителен.'

Что я делаю неправильно в моей строке WQL?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Вот запрос, который работает.Я знаю одно ... что синтаксис 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является квалифицированной ссылкой на этот объект учетной записи.

0 голосов
/ 04 января 2019

В вашем примере непонятно, почему это происходит с ошибкой, поскольку у вас не установлено условие 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'"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...