none
ejecutar comando shell como administrador RRS feed

  • Pregunta

  • Hola, estoy haciendo un programa en el cual tengo que detener un servicio. la funcion que uso es que por medio de un boton ejecute o siguiente:

     shell("net stop ""servicio"" ", appwinstyle.normalfocus, wait:=true)

    y lo que pasa es:

    1 me marca acceso denegado

    2 no se que signifique los dospuntos y el signo igual(:=)

    3 si hay alguna forma de dejar abierta la consola para ver lo queocurre por que se cierra muy rapido.

    bueno espero me puedan ayudar, gracias Y FELICES FIESTAS!!!!

    NOTA: tambien si me pueden decir por que casi no tengo ayuda disponible en la ayuda de visual studio. cuando quiero consultar una ayuda el 90% de las veces me marca informacion no encontrada y ya hice los pasos o sugerencias que manda pero sigo igual y ps asi como aprendo ja. gracias.

    jueves, 23 de diciembre de 2010 17:09

Respuestas

  • hola

    usa la funcionalidad de la clase Process

     

    Process Class

    ProcessStartInfo Class

     

    puedes usar algo como esto para iniciar la aplicacion

     

    Dim startInfo As System.Diagnostics.ProcessStartInfo

    Dim pStart As New System.Diagnostics.Process

    startInfo = New System.Diagnostics.ProcessStartInfo("C:\file.exe")

    pStart.StartInfo = startInfo

    pStart.Start()

    pStart.WaitForExit()

    y no el Shell()

    luego puedes definir la info de la cuenta que debe usar para ejecutar

    Process p = new Process("pathto.exe");
    p.StartInfo.UserName = "Administrator";
    p.StartInfo.Password = "password";
    p.Start();

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:20
    jueves, 23 de diciembre de 2010 17:56
  • Saludo Hserick,

    3 si hay alguna forma de dejar abierta la consola para ver lo queocurre por que se cierra muy rapido.

    Utiliza el metodo ReadLine de la clase Console al final del codigo, para mantener la aplicacion en modo de lectura

    Console.ReadLine();

     2 no se que signifique los dospuntos y el signo igual(:=)

    Francamente no te se dar una explicacion sertera puesto que no se lo que esta usando

    1 me marca acceso denegado

    Trata con esto:

    // Get the object on which the method will be invoked
       ManagementPath Servicepath = new ManagementPath("Win32_Service.Name='TapiSrv'");
       ManagementObject ServiceClass = new ManagementObject(Servicepath);
    
       Console.WriteLine("State Before: " + ServiceClass["State"]);
    
       // Start a Service 
       uint ReturnValue = (uint)ServiceClass.InvokeMethod("StartService", null);
    
       //// Stop a Service
       //uint ReturnValue = (uint)ServiceClass.InvokeMethod("StopService", null);
       
       // Display results   
       if (ReturnValue == 0) /*Generalmente esta seccion es para manejar el estado del proceso*/
       {
        Console.WriteLine("codigo de retorno del servicio:---" + ReturnValue + "---Exitoso");    
       }   


    Si la informacion te es de Utilidad marcala como Util

    Domingo Republica Dominicana

    • Editado Angel Jimenez jueves, 23 de diciembre de 2010 21:44 modificar
    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:20
    jueves, 23 de diciembre de 2010 21:42
  • 1 me marca acceso denegado
    Probablemente debido al UAC de Windows Vista (o 7), que te reduce los privilegios aunque seas administrador de la máquina. Se puede resolver añadiendo al proyecto un archivo  app.manifest (es una de las plantillas en Visual Studio 2008), y seleccionando dentro de él la opción que fuerza al programa a rodar como administrador (está entre comentarios dentro de la plantilla).
    2 no se que signifique los dospuntos y el signo igual(:=)

    En VB, la sintaxis parametro:=valor se usa para indicar cuál es el nombre del parámetro que estás pasando, cuando llamas a una subrutina que tiene múltiples parámetros opcionales y estás omitiendo algunos.

    De todas formas, para parar un servicio, en lugar de usar el Shell para llamar a Net Stop, yo te sugeriría usar la clase ServiceController, que puede hacerlo directamente desde dentro de tu programa sin salir al Shell.

    3 si hay alguna forma de dejar abierta la consola para ver lo queocurre por que se cierra muy rapido.
    Puedes meter una instrucción PAUSE dentro de los comandos que envías al shell.
    por que casi no tengo ayuda disponible en la ayuda de visual studio.

    A lo mejor es que no la has instalado entera. Durante la instalación te da la opción de instalar sólo partes de la ayuda, y lo mismo sólo tienes algunas. Podrías probar a reinstalar la ayuda.

    También puedes consultarla en línea a través de internet en www.msdn.com.

     

    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:20
    viernes, 24 de diciembre de 2010 8:22
  • Saludo, si te refiere a este codigo

    C#

    // Get the object on which the method will be invoked
      ManagementPath Servicepath = new ManagementPath("Win32_Service.Name='TapiSrv'");
      ManagementObject ServiceClass = new ManagementObject(Servicepath);
    
      Console.WriteLine("State Before: " + ServiceClass["State"]);
    
      // Start a Service 
      uint ReturnValue = (uint)ServiceClass.InvokeMethod("StartService", null);
    
      //// Stop a Service
      //uint ReturnValue = (uint)ServiceClass.InvokeMethod("StopService", null);
      
      // Display results  
      if (ReturnValue == 0) /*Generalmente esta seccion es para manejar el estado del proceso*/
      {
      Console.WriteLine("codigo de retorno del servicio:---" + ReturnValue + "---Exitoso");  
      }  

    VB

    ' Get the object on which the method will be invoked
    Dim Servicepath As New ManagementPath("Win32_Service.Name='TapiSrv'")
    Dim ServiceClass As New ManagementObject(Servicepath)
    
    Console.WriteLine("State Before: " + ServiceClass("State"))
    
    ' Start a Service 
    Dim ReturnValue As UInteger = CUInt(ServiceClass.InvokeMethod("StartService", Nothing))
    
    '''/ Stop a Service
    'uint ReturnValue = (uint)ServiceClass.InvokeMethod("StopService", null);
    
    ' Display results  
    If ReturnValue = 0 Then
    	'Generalmente esta seccion es para manejar el estado del proceso
    	Console.WriteLine("codigo de retorno del servicio:---" & ReturnValue & "---Exitoso")
    End If

    Si la informacion te fue de Utilidad marcala como util

    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:20
    viernes, 31 de diciembre de 2010 13:36
  • por que no usas el service controler

    http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx

     


    Live like you'll die tomorrow, learn like you'll live forever. http://underframework.wordpress.com/
    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:21
    martes, 4 de enero de 2011 20:41
  • Lo de usar ServiceController ya lo sugerí yo varios mensajes más arriba, para evitar llamar al Shell.

    Pero no resuelve el problema original, consistente en que el programa no tiene suficientes permisos para realizar la operación. Los permisos se siguen necesitando con el ServiceController, igual que con el Shell.

    El problema es casi seguro debido al UAC, que limita los permisos del programa en Windows Vista o Windows 7 aunque el usuario sea administrador. Se puede saltar esa limitación haciendo click-derecho sobre el ejecutable del programa y seleccionando "ejecutar como administrador". Y si se quiere que el propio programa realice esta operación automáticamente, se puede conseguir añadiendo un app.manifest. Para añadirlo con comodidad hace falta Visual Studio 2008. En versiones anteriores no existe la plantilla, y se necesita realizar la configuración manualmente con herramientas externas.

    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:21
    miércoles, 5 de enero de 2011 6:29
  • Hola hsherick... intenta con esto:

    1) Agrega un nuevo elemento a tu solución (clic derecho a la solucion/ agregar/nuevo elemento)

    2) En la ventana que aparezca, selecciona "General", y en la ventana derecha seleccionas "Archivo de Manifiesto de aplicacion"

    3) Se agregará a tu aplicación el archivo "app1.manifest", abrelo y cambia la linea "<requestedExecutionLevel level="asInvoker" uiAccess="false" />" por <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

    Al correr tu aplicación se te pedirá que reinicies visual studio, confirmalo sin temor y nos comentas los resultados...

    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:15
    jueves, 14 de marzo de 2013 21:08

Todas las respuestas

  • hola

    usa la funcionalidad de la clase Process

     

    Process Class

    ProcessStartInfo Class

     

    puedes usar algo como esto para iniciar la aplicacion

     

    Dim startInfo As System.Diagnostics.ProcessStartInfo

    Dim pStart As New System.Diagnostics.Process

    startInfo = New System.Diagnostics.ProcessStartInfo("C:\file.exe")

    pStart.StartInfo = startInfo

    pStart.Start()

    pStart.WaitForExit()

    y no el Shell()

    luego puedes definir la info de la cuenta que debe usar para ejecutar

    Process p = new Process("pathto.exe");
    p.StartInfo.UserName = "Administrator";
    p.StartInfo.Password = "password";
    p.Start();

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:20
    jueves, 23 de diciembre de 2010 17:56
  • Saludo Hserick,

    3 si hay alguna forma de dejar abierta la consola para ver lo queocurre por que se cierra muy rapido.

    Utiliza el metodo ReadLine de la clase Console al final del codigo, para mantener la aplicacion en modo de lectura

    Console.ReadLine();

     2 no se que signifique los dospuntos y el signo igual(:=)

    Francamente no te se dar una explicacion sertera puesto que no se lo que esta usando

    1 me marca acceso denegado

    Trata con esto:

    // Get the object on which the method will be invoked
       ManagementPath Servicepath = new ManagementPath("Win32_Service.Name='TapiSrv'");
       ManagementObject ServiceClass = new ManagementObject(Servicepath);
    
       Console.WriteLine("State Before: " + ServiceClass["State"]);
    
       // Start a Service 
       uint ReturnValue = (uint)ServiceClass.InvokeMethod("StartService", null);
    
       //// Stop a Service
       //uint ReturnValue = (uint)ServiceClass.InvokeMethod("StopService", null);
       
       // Display results   
       if (ReturnValue == 0) /*Generalmente esta seccion es para manejar el estado del proceso*/
       {
        Console.WriteLine("codigo de retorno del servicio:---" + ReturnValue + "---Exitoso");    
       }   


    Si la informacion te es de Utilidad marcala como Util

    Domingo Republica Dominicana

    • Editado Angel Jimenez jueves, 23 de diciembre de 2010 21:44 modificar
    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:20
    jueves, 23 de diciembre de 2010 21:42
  • 1 me marca acceso denegado
    Probablemente debido al UAC de Windows Vista (o 7), que te reduce los privilegios aunque seas administrador de la máquina. Se puede resolver añadiendo al proyecto un archivo  app.manifest (es una de las plantillas en Visual Studio 2008), y seleccionando dentro de él la opción que fuerza al programa a rodar como administrador (está entre comentarios dentro de la plantilla).
    2 no se que signifique los dospuntos y el signo igual(:=)

    En VB, la sintaxis parametro:=valor se usa para indicar cuál es el nombre del parámetro que estás pasando, cuando llamas a una subrutina que tiene múltiples parámetros opcionales y estás omitiendo algunos.

    De todas formas, para parar un servicio, en lugar de usar el Shell para llamar a Net Stop, yo te sugeriría usar la clase ServiceController, que puede hacerlo directamente desde dentro de tu programa sin salir al Shell.

    3 si hay alguna forma de dejar abierta la consola para ver lo queocurre por que se cierra muy rapido.
    Puedes meter una instrucción PAUSE dentro de los comandos que envías al shell.
    por que casi no tengo ayuda disponible en la ayuda de visual studio.

    A lo mejor es que no la has instalado entera. Durante la instalación te da la opción de instalar sólo partes de la ayuda, y lo mismo sólo tienes algunas. Podrías probar a reinstalar la ayuda.

    También puedes consultarla en línea a través de internet en www.msdn.com.

     

    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:20
    viernes, 24 de diciembre de 2010 8:22
  • gracias por la respuesta pero el lenguaje que uso es visual basic y creo que la respuesta que me diste es para javascript, de todas formas gracias.
    jueves, 30 de diciembre de 2010 7:16
  • Gracias me ha servido de algo (aprender otras cosas) pero aun no logro resolver mi conflicto. y bueno no tengo la plantilla de app.manifest , estoy buscandolo en internet pero solo encuentro codigo en xml, ¿este es el que me comentas , tengo que incrustar ?, y tambien ya use el servicecontroller pero me sigue marcando igual acceso denegado.. y en si, lo que quiero hacer es :

    Tengo una vaio laptop, aveces cuando la prendo en modo bateria no funciona la tecla de fn que es la que me ayuda para controlar volumen y  brillo principalmente, entonces para no reiniciarla tengo que detener el servicio desde la consola cmd, no cuesta trabajo pero yo quiero hacer un programa para que con solo un boton me ahorre el escribir bastante codigo, y me encontre que el comando shell invoca comandos msdos y todo iba bien hasta que me aparecio el "ACCESO DENEGADO", y como ya lo he coentado no soy experto(si lo fuera no estuviera molestandolos jajaja)asi que la primera respuesta me parecio buena pero realmente no entendi" el archivo startinfo tendria que ser cmd.exe?, y process p = newprocess ("pathto.exe"); cual seria ese programa ejecutable?. ahora he visto que hay opciones dentro como MY.USER.CURRENTPRINCIPAL esto podria servir?

    jueves, 30 de diciembre de 2010 7:29
  • Saludo, si te refiere a este codigo

    C#

    // Get the object on which the method will be invoked
      ManagementPath Servicepath = new ManagementPath("Win32_Service.Name='TapiSrv'");
      ManagementObject ServiceClass = new ManagementObject(Servicepath);
    
      Console.WriteLine("State Before: " + ServiceClass["State"]);
    
      // Start a Service 
      uint ReturnValue = (uint)ServiceClass.InvokeMethod("StartService", null);
    
      //// Stop a Service
      //uint ReturnValue = (uint)ServiceClass.InvokeMethod("StopService", null);
      
      // Display results  
      if (ReturnValue == 0) /*Generalmente esta seccion es para manejar el estado del proceso*/
      {
      Console.WriteLine("codigo de retorno del servicio:---" + ReturnValue + "---Exitoso");  
      }  

    VB

    ' Get the object on which the method will be invoked
    Dim Servicepath As New ManagementPath("Win32_Service.Name='TapiSrv'")
    Dim ServiceClass As New ManagementObject(Servicepath)
    
    Console.WriteLine("State Before: " + ServiceClass("State"))
    
    ' Start a Service 
    Dim ReturnValue As UInteger = CUInt(ServiceClass.InvokeMethod("StartService", Nothing))
    
    '''/ Stop a Service
    'uint ReturnValue = (uint)ServiceClass.InvokeMethod("StopService", null);
    
    ' Display results  
    If ReturnValue = 0 Then
    	'Generalmente esta seccion es para manejar el estado del proceso
    	Console.WriteLine("codigo de retorno del servicio:---" & ReturnValue & "---Exitoso")
    End If

    Si la informacion te fue de Utilidad marcala como util

    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:20
    viernes, 31 de diciembre de 2010 13:36
  • Gracias por la respuesta pero tampoco me sirvio en el código Managementpath y managementobject me dice el tipo no esta definido. y en lo demas no se ha declarado el nombre uint, los argumentos de metodo deben de ir entre parentesis, null no se ha declarado y ya no se admite la constante null de la base de datos. y bueno. aun me falta mucho por aprender, de todas formas gracias por la ayuda.
    lunes, 3 de enero de 2011 22:24
  • por que no usas el service controler

    http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx

     


    Live like you'll die tomorrow, learn like you'll live forever. http://underframework.wordpress.com/
    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:21
    martes, 4 de enero de 2011 20:41
  • Lo de usar ServiceController ya lo sugerí yo varios mensajes más arriba, para evitar llamar al Shell.

    Pero no resuelve el problema original, consistente en que el programa no tiene suficientes permisos para realizar la operación. Los permisos se siguen necesitando con el ServiceController, igual que con el Shell.

    El problema es casi seguro debido al UAC, que limita los permisos del programa en Windows Vista o Windows 7 aunque el usuario sea administrador. Se puede saltar esa limitación haciendo click-derecho sobre el ejecutable del programa y seleccionando "ejecutar como administrador". Y si se quiere que el propio programa realice esta operación automáticamente, se puede conseguir añadiendo un app.manifest. Para añadirlo con comodidad hace falta Visual Studio 2008. En versiones anteriores no existe la plantilla, y se necesita realizar la configuración manualmente con herramientas externas.

    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:21
    miércoles, 5 de enero de 2011 6:29
  • Hola hsherick... intenta con esto:

    1) Agrega un nuevo elemento a tu solución (clic derecho a la solucion/ agregar/nuevo elemento)

    2) En la ventana que aparezca, selecciona "General", y en la ventana derecha seleccionas "Archivo de Manifiesto de aplicacion"

    3) Se agregará a tu aplicación el archivo "app1.manifest", abrelo y cambia la linea "<requestedExecutionLevel level="asInvoker" uiAccess="false" />" por <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

    Al correr tu aplicación se te pedirá que reinicies visual studio, confirmalo sin temor y nos comentas los resultados...

    • Marcado como respuesta hserick jueves, 14 de marzo de 2013 22:15
    jueves, 14 de marzo de 2013 21:08
  • Gracias por la respuesta y de hecho ya no seguí con este proyecto (ya no recuerdo porque :-) ) , pero el problema queme ocurría se quito cuando cambie el SO y no he tenido la necesidad arreglar  algo, por otro lado recuerdo que lo de Service Controller no lo podía usar debido a que no tenía la versión completa sino la Express, y a últimas lo que hice fue crear un archivo bat que ejecutara los comandos y arreglara el problema automáticamente, de todas formas gracias por sus respuestas y perdón por no marcar antes.

    Saludos


    Hasta Siempre.... Erick Martínez.

    jueves, 14 de marzo de 2013 22:20