Запуск от имени админа

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by kardinalmax, 6 May 2015.

  1. kardinalmax

    kardinalmax Member

    Joined:
    7 Dec 2013
    Messages:
    21
    Likes Received:
    6
    Reputations:
    0
    Можно ли как то в с# прописать запуск проги от имени админа? Проблема в том, что если мой софт запустить по обычному, то при запуске будет к сожалению ошибка на некоторых версиях винды.
     
  2. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Манифест
    Убрать <requestedExecutionLevel level="asInvoker" uiAccess="false" />
    Добавить <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
     
  3. kardinalmax

    kardinalmax Member

    Joined:
    7 Dec 2013
    Messages:
    21
    Likes Received:
    6
    Reputations:
    0
    при запуске софта выполняется сначала внешняя оболочка проги, а потом уже внутренняя. Вот с помощью этого я тупо запущу внутреннюю через админа. А мне надо внешнюю.
     
  4. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Напиши сразу все подробности. Что там за оболочки?
     
  5. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,108
    Likes Received:
    8,495
    Reputations:
    25
    Можно и без манифеста. Только по необходимости. Когда используется код, требующий повышенных привилегий.

    http://www.cyberforum.ru/blogs/251328/blog280.html

    UPD: и без перезагрузки.

    Code:
    using System.Runtime.InteropServices; // DllImport
    using System.Security.Principal; // WindowsImpersonationContext
    using System.Security.Permissions; // PermissionSetAttribute
    ...
    public WindowsImpersonationContext
        ImpersonateUser(string sUsername, string sDomain, string sPassword)
    {
        // initialize tokens
        IntPtr pExistingTokenHandle = new IntPtr(0);
        IntPtr pDuplicateTokenHandle = new IntPtr(0);
        pExistingTokenHandle = IntPtr.Zero;
        pDuplicateTokenHandle = IntPtr.Zero;
    
        // if domain name was blank, assume local machine
        if (sDomain == "")
            sDomain = System.Environment.MachineName;
        try
        {
            string sResult = null;
            const int LOGON32_PROVIDER_DEFAULT = 0;
            // create token
            const int LOGON32_LOGON_INTERACTIVE = 2;
            //const int SecurityImpersonation = 2;
            // get handle to token
            bool bImpersonated = LogonUser(sUsername, sDomain, sPassword,
                LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
                    ref pExistingTokenHandle);
            // did impersonation fail?
            if (false == bImpersonated)
            {
                int nErrorCode = Marshal.GetLastWin32Error();
                sResult = "LogonUser() failed with error code: " +
                    nErrorCode + "\r\n";
                // show the reason why LogonUser failed
                MessageBox.Show(this, sResult, "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            // Get identity before impersonation
            sResult += "Before impersonation: " +
                WindowsIdentity.GetCurrent().Name + "\r\n";
            bool bRetVal = DuplicateToken(pExistingTokenHandle,
                (int)SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation,
                    ref pDuplicateTokenHandle);
            // did DuplicateToken fail?
            if (false == bRetVal)
            {
                int nErrorCode = Marshal.GetLastWin32Error();
                // close existing handle
                CloseHandle(pExistingTokenHandle);
                sResult += "DuplicateToken() failed with error code: "
                    + nErrorCode + "\r\n";
                // show the reason why DuplicateToken failed
                MessageBox.Show(this, sResult, "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                return null;
            }
            else
            {
                // create new identity using new primary token
                WindowsIdentity newId = new WindowsIdentity
                                            (pDuplicateTokenHandle);
                WindowsImpersonationContext impersonatedUser =
                                            newId.Impersonate();
                // check the identity after impersonation
                sResult += "After impersonation: " +
                    WindowsIdentity.GetCurrent().Name + "\r\n";
           
                MessageBox.Show(this, sResult, "Success",
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
                return impersonatedUser;
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            // close handle(s)
            if (pExistingTokenHandle != IntPtr.Zero)
                CloseHandle(pExistingTokenHandle);
            if (pDuplicateTokenHandle != IntPtr.Zero)
                CloseHandle(pDuplicateTokenHandle);
        }
    }
     
    #5 DartPhoenix, 6 May 2015
    Last edited: 6 May 2015