2016-10-18 2 views
-8

Я пытаюсь добавить код в существующий проект, который проверяет наличие устройства в SCCM и удаляет его, если он существует. Кажется, я что-то пропустил, в этом конкретном блоке кода. Я получаю сообщение об ошибке - «объект» не содержит определения для «ExecuteQuery», и не может быть найден метод расширения «ExecuteQuery», принимающий первый аргумент типа «объект».C# - Visual Studio - «объект» не содержит определения для «ExecuteQuery»

Здесь C# код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Net.NetworkInformation; 
using SupportToolkit.Models; 
using SupportToolkit.WindowsAutomationServices; 
using NLog; 
using System.Text; 
using System.DirectoryServices; 
using System.DirectoryServices.AccountManagement; 
using System.Management; 


namespace SupportToolkit.Controllers 
{ 
public class TPOSRecordDeletionController : Controller 
{ 
private static Logger recordDeletionLogger = LogManager.GetCurrentClassLogger(); 

[Authorize(Roles = @"nor\NST_RIT_Users,nor\NST_STM_Users,nor\NST_Admin_Users,nor\NST_CORP_Users")] 

// GET: TPOSRecordDeletion 
public ActionResult Index(TPOSRecordDeletionModel model) 
{ 
    if (model.ComputerName != null) 
    { 

    } 

    if (ModelState.IsValid) 
    { 
     if (!(string.IsNullOrEmpty(model.btnDeleteRecord))) 
     { 
      InvokeRecordDeletion(model); 
     } 
    } 
    return View(model); 
} 

[Authorize(Roles = @"nor\NST_RIT_Users,nor\NST_STM_Users,nor\NST_Admin_Users,nor\NST_CORP_Users")] 
public string InvokeRecordDeletion(TPOSRecordDeletionModel model) 
{ 
    model.Status = "Running Service"; 
    var windowsAutomationService = new WindowsAutomationServicesClient(); 
    string shortServiceOutput; 

    var serviceAction = "Remove-TPOSRecords"; 

    var SCCMServer = "server.nor.net"; 

    var siteCode = "PO60"; 

    string[] recordDeletionArguments = new string[1]; 
    recordDeletionArguments[0] = model.ComputerName; 

    model.Status = "Processing" + model.ComputerName; 

    Ping pingSender = new Ping(); 
    PingOptions options = new PingOptions(); 

    // Use the default Ttl value which is 128, 
    // but change the fragmentation behavior. 
    options.DontFragment = true; 

    // Create a buffer of 32 bytes of data to be transmitted. 
    string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 
    byte[] buffer = Encoding.ASCII.GetBytes(data); 
    int timeout = 120; 
    PingReply reply = pingSender.Send(model.ComputerName, timeout, buffer, options); 

    if (reply.Status == IPStatus.Success) 
    { 
     model.Status = model.ComputerName + "is currently online and will not be removed!"; 
    } 

    else 
    { 
     // set up domain context 
     using (var ctx = new System.DirectoryServices.AccountManagement.PrincipalContext(System.DirectoryServices.AccountManagement.ContextType.Domain)) 
     { 
      // find a computer 
      ComputerPrincipal computer = ComputerPrincipal.FindByIdentity(ctx, model.ComputerName); 

      if (computer == null) 
      { 
       model.Status = model.ComputerName + "does not exist in Active Directory.";  
      } 

      else 
      { 
       computer.Delete(); 
       model.Status = model.ComputerName + "successfully removed from Active Directory!"; 
      } 

      //insert code here for checking for existence of computer in SCCM and removing from SCCM if exists 

SmsNamedValuesDictionary namedValues = new SmsNamedValuesDictionary(); 

      WqlConnectionManager connection = new WqlConnectionManager(namedValues); 
      connection.Connect("s0319p60.nordstrom.net"); 

      foreach (IResultObject computerobject in connection.QueryProcessor.ExecuteQuery("Select ResourceID From SMS_R_System Where Name ='" + model.ComputerName + "'")) 

      { 
       if (computerobject == null) 
       { 
        model.Status = model.ComputerName + "does not exist in SCCM."; 
       } 

       else 
       { 
        computerobject.Delete(); 
        model.Status = model.ComputerName + "successfully removed from SCCM!"; 
       } 
     } 
    } 

    var userName = User.Identity.Name; 

    var serviceOutput = windowsAutomationService.RunAutomationService(serviceAction, userName, recordDeletionArguments); 

    recordDeletionLogger.Info(userName + " is attempting to remove the record " + model.ComputerName); 

    if (serviceOutput.Length >= 7) 
    { 
     shortServiceOutput = serviceOutput.Substring(0, 7); 
     shortServiceOutput = shortServiceOutput.ToLower(); 
    } 
    else 
    { 
     shortServiceOutput = serviceOutput; 
     shortServiceOutput = shortServiceOutput.ToLower(); 
    } 


    if (shortServiceOutput == "success") 
    { 
     model.Status = "Successfully removed " + model.ComputerName + " from SCCM and Active Directory"; 
     recordDeletionLogger.Info(userName + " successfully removed " + model.ComputerName + " from SCCM and Active Directory"); 
     return "Success"; 
    } 

    else 
    { 
     model.Status = "Failure removing " + model.ComputerName + " from SCCM and Active Directory. Unknown Error"; 
     recordDeletionLogger.Info(userName + " failed to remove " + model.ComputerName + " from SCCM and Active Directory"); 
     return "Failure"; 

    } 

} 
} 
} 

internal interface IResultObject 
{ 
//void Delete(); 
void Delete(); 
} 

internal class WqlConnectionManager 
{ 
private SmsNamedValuesDictionary namedValues; 

public WqlConnectionManager(SmsNamedValuesDictionary namedValues) 
{ 
    this.namedValues = namedValues; 
} 

public object QueryProcessor { get; internal set; } 

internal void Connect(string v) 
{ 
    throw new NotImplementedException(); 
} 

public object ExecuteQuery { get; internal set; } 
} 

internal class SmsNamedValuesDictionary 
{ 
public SmsNamedValuesDictionary() 
{ 
} 
} 
+1

'public object ExecuteQuery {get; внутренний набор; } 'Какой тип должен быть здесь вместо объекта? – Will

+0

Если это чей-то код и он разработан именно по какой-либо причине, выясните, какой тип является значением этого свойства на самом деле, и явно приложите его к этому типу при его использовании. –

+0

Куда во всем этом коде вы получаете эту ошибку? – David

ответ

0

Вы создаете пользовательский "соединение" объект:

WqlConnectionManager connection = new WqlConnectionManager(namedValues); 

Затем вызвать метод на одном из его свойств:

connection.QueryProcessor.ExecuteQuery("...") 

Но что это такое QueryProcessor недвижимость? ...

public object QueryProcessor { get; internal set; } 

Это object. Как заявляет ошибка, object не имеет метода, называемого ExecuteQuery. (Это не имеет очень много методов и свойств на всех, на самом деле.)

Я не могу сказать, из этого кода (может быть, я что-то не хватает?), Что конкретных типа вы ожидаете QueryProcessor к но это определенно будет чем-то более конкретным, чем object. Возможно, что-то похожее на объект SQLCommand? По существу, любой тип имел бы такой метод ExecuteQuery.

Если в существующей кодовой базе есть веская причина, чтобы она имела тип object, вам нужно будет определить, в чем причина. Кажется, что здесь много пользы object, что пахнет некоторыми плохими вариантами дизайна, прежде чем вы туда попали.

+0

ДА - вы полностью понимаете. Я работаю над проектом, который кто-то еще начал, но не закончил. Это не идеальная ситуация. Я не верю, что в существующей кодовой базе для ExecuteQuery есть объект типа type - я честно не уверен ни в одном из кода в нижней части. Похоже, что многое из этого было просто добавлено ради «исправления» ошибок. – LilithGoddess

+0

Извините, я подразумевал, что QueryProcessor будет иметь объект типа. – LilithGoddess

0

Хорошо - после нескольких дней поиска я окончательно выяснил проблему.

Весь блок кода в конце не нужен. Проблема заключалась в том, что отсутствовали ссылки на сборку и использование операторов в коде. В частности:

using Microsoft.ConfigurationManagement.ManagementProvider; 
using Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine; 

Соответствующие DLL-элементы также должны быть добавлены в проект как ссылка.

Я надеюсь, что это поможет кому-то, кто сталкивается с подобными проблемами и не разбирается в кодировании на C#. Я сам только разбираюсь в PowerShell, поэтому для этого мне понадобилось много работы. Благодарю.

Смежные вопросы