Desactivar un adaptador de red desde C#

Iniciado por el_doctor, 16 Septiembre 2013, 23:37 PM

0 Miembros y 1 Visitante están viendo este tema.

el_doctor

Saludos, estoy intentando desactivar la tarjeta de red usando una aplicación en C# pero no se si lo he hecho bien o me falta algo ya que al ejecutar el programa no me desactiva la tarjeta de red, estoy usando la clase Win32_NetworkAdapter y mi función queda así:

Código (csharp) [Seleccionar]
private void DisableNetworkByAdapterType(string adapterType)
       {

           var query = new SelectQuery("Win32_NetworkAdapter",
                                       "NetConnectionStatus=2 and AdapterType='" + adapterType + "'");

           var searcher = new ManagementObjectSearcher(query);

           foreach (ManagementObject result in searcher.Get())
           {
               result.InvokeMethod("Disable", null);
           }
       }


nota: el parámetro adapterType yo le mando "Ethernet 802.3"

Eleкtro

#1
Citar
Código (csharp) [Seleccionar]
"NetConnectionStatus=2 and AdapterType='" + adapterType + "'")

Debes especificar el keyword "WHERE", y luego concatenar con "AND".

Código (csharp) [Seleccionar]
"WHERE NetConnectionStatus='2' and AdapterType='" + adapterType + "'")

Por lo demás lo veo bien, si estás usando Windows 8 entonces deberías usar la Class MSFT_NetAdapter.

Te muestro como lo hice en VB.NET:



Código (vbnet) [Seleccionar]
       Dim QueryFormat As String = _
           String.Format( _
           "SELECT {0} FROM Win32_NetworkAdapter WHERE AdapterType = '{1}' And NetConnectionStatus = '{2}'", _
           "AdapterType,NetConnectionID,NetConnectionStatus", _
           "Ethernet 802.3", _
           "2" _
           )

       Dim Query As New ObjectQuery(QueryFormat)
       Dim Searcher As New ManagementObjectSearcher(Query)

       For Each result As ManagementObject In Searcher.Get


           MsgBox(String.Format(" NetConnectionID: {1}{0} NetConnectionStatus: {2}{0} AdapterType: {3}{0}", _
                                Environment.NewLine & Environment.NewLine, _
                                result.Item("NetConnectionID"), _
                                result.Item("NetConnectionStatus"), _
                                result.Item("AdapterType")))

           Try
               result.InvokeMethod("Disable", Nothing)
           Catch ex As Exception
               MessageBox.Show(ex.Message)
           End Try

       Next




Traducción a C# (No lo he testeado):

Código (csharp) [Seleccionar]

string QueryFormat = string.Format("SELECT {0} FROM Win32_NetworkAdapter WHERE AdapterType = '{1}' And NetConnectionStatus = '{2}'", "AdapterType,NetConnectionID,NetConnectionStatus", "Ethernet 802.3", "2");

ObjectQuery Query = new ObjectQuery(QueryFormat);
ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Query);


foreach (ManagementObject result in Searcher.Get) {

Interaction.MsgBox(string.Format(" NetConnectionID: {1}{0} NetConnectionStatus: {2}{0} AdapterType: {3}{0}", Environment.NewLine + Environment.NewLine, result.Item("NetConnectionID"), result.Item("NetConnectionStatus"), result.Item("AdapterType")));

try {
result.InvokeMethod("Disable", null);
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}

}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//Conversion powered by NRefactory.
//Twitter: @telerik
//Facebook: facebook.com/telerik
//=======================================================



Saludos!








el_doctor

Saludos gracias por tu observación Elecktro pero el problema no está en la consulta, ya que estoy usando SelectQuery este método acepta dos parámetros que son la clase que vas usar y la condición y por defecto el agrega a la consulta la instrucción Select * y Where si agregas where dentro del parámetro de condición te da un error en la consulta.

Referente a la clase que estoy usando uso la "Win32_NetworkAdapter" porque quiero que funcione tanto para windows xp como con windows 8 aunque estoy haciendo las pruebas con windows 8 no se si eso tiene que ver yo entendería que a pesar de ser obsoleta la clase puede funcionar en windows 8 pero tengo mis dudas en eso, o no se si es problemas de privilegios de administrador.

el_doctor

#3
He intentado utilizar la clase MSFT_NetAdapter para ver si es problema de la versión de Windows ya que estoy usando windows 8 lo he implementado igual que la clase "Win32_NetworkAdapter" pero en el foreach me da un error y me dice clase no válida alguien me puede decir por que el error? o es que en esta clase hay que hacerlo de otra forma, el código de la implementación es el siguiente:

Código (csharp) [Seleccionar]
const string adapterType = "802.3";
var query = new SelectQuery("MSFT_NetAdapter", "State=2 and NdisMedium='" + adapterType + "'");

           var searcher = new ManagementObjectSearcher(query);

           foreach (ManagementObject result in searcher.Get())
           {
               var state = result["State"];
               var ndisMedium = result["NdisMedium"];
               result.InvokeMethod("Disable", null);
               result.InvokeMethod("Lock", null);
             
           }


Si alguien puede ayudarme se los agradezco