none
Solicitar permisos de administrador en Windows Vista

    Pregunta

  • Tengo una aplicación. Esta debe copiar datos a Archivos de programa. Pero en windows vista solo puede con permisos de administrador.

    ¿Como puedo hacer para que al ejecutarse el programa solicite los permisos?
    Lo he visto en otros programas y no se como se hace.

    Gracias por responder.

    jueves, 31 de diciembre de 2009 9:49

Respuestas

  • Es más sencillo de lo que crees, al menos si te he entendido bien...

    Te vas a my project y le das doble click, entras en la pestaña de aplicación y verás un botón que pone "Ver configuración de UAC", pues lo pulsas

    Te aparecera un archivo xml de configuración con unas lineas comentadas:

    <requestedExecutionLevel level="asInvoker" uiAccess="false" />

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

    <requestedExecutionLevel level="highestAvailable" uiAccess="false" />

    Pues tan solo tienes que descomentar la linea del medio, la de requireAdministrator.

    A partir de ahí tu aplicación solicitará los permisos de administrador... o al menos en teoría debería ser así....


    Iván Noya Cendal
    http://www.seuvella.com

    Si la respuesta te ha ayudado, marcala.
    jueves, 31 de diciembre de 2009 10:16
  • IncaSoft tiene razon. ese método hace lo que tu deseas pero le hare unas modificaciones. 

    cambia esta linea
    <requestedExecutionLevel level="asInvoker" uiAccess="false" />

    por esta 

    <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

    jueves, 31 de diciembre de 2009 20:58

Todas las respuestas

  • Es más sencillo de lo que crees, al menos si te he entendido bien...

    Te vas a my project y le das doble click, entras en la pestaña de aplicación y verás un botón que pone "Ver configuración de UAC", pues lo pulsas

    Te aparecera un archivo xml de configuración con unas lineas comentadas:

    <requestedExecutionLevel level="asInvoker" uiAccess="false" />

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

    <requestedExecutionLevel level="highestAvailable" uiAccess="false" />

    Pues tan solo tienes que descomentar la linea del medio, la de requireAdministrator.

    A partir de ahí tu aplicación solicitará los permisos de administrador... o al menos en teoría debería ser así....


    Iván Noya Cendal
    http://www.seuvella.com

    Si la respuesta te ha ayudado, marcala.
    jueves, 31 de diciembre de 2009 10:16
  • No, no es eso. Es k pa copiar el archivo, si no tiene permisos, da error. Entonces quiero que los solicite, esto que ponen:
    Tal programa solicita su permiso para continuar.
    Eso. Porque si no, le das, y salta error. No se puede acceder a la carpeta taltaltal.
    Entiendes¿?
    jueves, 31 de diciembre de 2009 14:53
  • IncaSoft tiene razon. ese método hace lo que tu deseas pero le hare unas modificaciones. 

    cambia esta linea
    <requestedExecutionLevel level="asInvoker" uiAccess="false" />

    por esta 

    <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

    jueves, 31 de diciembre de 2009 20:58
  • A k te refieres? La pongo así:

    <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
    <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
    <requestedExecutionLevel level="highestAvailable" uiAccess="false" />

    O así?

    <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
    <requestedExecutionLevel level="highestAvailable" uiAccess="false" />
    viernes, 01 de enero de 2010 11:55
  • Las lineas verdes no las toques son solo comentarios.
    solo remplaza la linea
    <requestedExecutionLevel level="asInvoker" uiAccess="false" />

    por

    <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

    viernes, 01 de enero de 2010 23:29
  • Hola!

    ¿Fue posible solucionar su problema?

    Saludos!
    Rafael Fagundes - Marque la respuesta como correcta si te ha sido de utilidad!
    jueves, 14 de enero de 2010 13:45
  • No se como le haya ido a el amigo... Justiciero Misterioso... pero a mi me funciono...

    GRACIAS POR EL APORTE

    viernes, 07 de mayo de 2010 0:17
  • esta modificación hace que mi aplicacion solicite permisos de administrador para ser ejecutada. sin embargo, cuando voy a copiar un fichero en una carpeta de windows, sigue apareciendo el mensaje de acceso denegado.

    tengo una clase para hacer login con usuario y contraseña de administrador, y despues llamo al procedimiento que copia el fichero, pero ni así:

     

    Imports System.Collections.Generic
    Imports System.Linq
    Imports System.Web
    Imports System.Runtime.InteropServices
    Imports System.Security.Principal

    Public Class Impersonation

    #Region "Consts"

        Public Const LOGON32_LOGON_INTERACTIVE As Integer = 2 '9
        Public Const LOGON32_PROVIDER_DEFAULT As Integer = 0 '3

        Dim impersonationContext As WindowsImpersonationContext
        Dim username As String
        Dim domain As String
        Dim password As String

    #End Region

    #Region "Constructors"

        Sub New(ByVal _userName As String, ByVal _domain As String, ByVal _password As String)
            username = _userName
            domain = _domain
            password = _password
        End Sub

    #End Region

    #Region "External API"

        <DllImport("advapi32.dll", SetLastError:=True)>
        Public Shared Function LogonUser(ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String, ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, ByRef phToken As IntPtr) As Integer
        End Function

        <DllImport("advapi32.dll", SetLastError:=True)>
        Public Shared Function RevertToSelf() As Boolean
        End Function

        <DllImport("kernel32.dll", SetLastError:=True)>
        Public Shared Function CloseHandle(ByVal hObject As IntPtr) As Integer
        End Function

    #End Region

    #Region "Methods"

        Public Sub PerformImpersonatedTask(ByVal methodToPerform As Action)
            Dim token As IntPtr = IntPtr.Zero
            If RevertToSelf() Then
                If LogonUser(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, token) <> 0 Then
                    Dim identity = New WindowsIdentity(token)
                    impersonationContext = identity.Impersonate()
                    If impersonationContext IsNot Nothing Then
                        methodToPerform.Invoke()
                        impersonationContext.Undo()
                    End If
                Else
                End If
            End If
            If token <> IntPtr.Zero Then
                CloseHandle(token)
            End If
        End Sub

    #End Region
    End Class

     

    estas son las lineas que ejecutan el login y el metodo que copia el fichero:

    Dim imp As Impersonation = New Impersonation(user, domain, pwd)
    imp.PerformImpersonatedTask(New Action(AddressOf CopyMacros))

     

    por ultimo, el metodo que copia el fichero:

    Public Sub CopyMacros()
            Try
                Dim macro = My.Resources.iManO2K_xla
                File.WriteAllBytes(rootWORD, macro)
                Console.WriteLine("{0} downloaded", macro.ToString)

            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
        End Sub

     

    jueves, 27 de octubre de 2011 12:08