2015-07-17 7 views
3

Итак, я хочу, чтобы запустить программу в режиме администратора (UAC)Python окна привилегий

После некоторого копания я foud это:

import os 
import types 
from traceback import print_exc 
from sys import argv, executable 




def isUserAdmin(): 

    if os.name == 'nt': 
     import ctypes 
     # WARNING: requires Windows XP SP2 or higher! 
     try: 
      return ctypes.windll.shell32.IsUserAnAdmin() 
     except: 
      print_exc() 
      print "Admin check failed, assuming not an admin." 
      return False 
    elif os.name == 'posix': 
     # Check for root on Posix 
     return os.getuid() == 0 
    else: 
     raise RuntimeError, "Unsupported operating system for this module: %s" % (os.name,) 

def runAsAdmin(cmdLine=None, wait=True): 

    if os.name != 'nt': 
     raise RuntimeError, "This function is only implemented on Windows." 

    import win32api, win32con, win32event, win32process 
    from win32com.shell.shell import ShellExecuteEx 
    from win32com.shell import shellcon 

    python_exe = executable 

    if cmdLine is None: 
     cmdLine = [python_exe] + argv 
    elif type(cmdLine) not in (types.TupleType,types.ListType): 
     raise ValueError, "cmdLine is not a sequence." 
    cmd = '"%s"' % (cmdLine[0],) 
    # XXX TODO: isn't there a function or something we can call to massage command line params? 
    params = " ".join(['"%s"' % (x,) for x in cmdLine[1:]]) 
    cmdDir = '' 
    showCmd = win32con.SW_SHOWNORMAL 
    #showCmd = win32con.SW_HIDE 
    lpVerb = 'runas' # causes UAC elevation prompt. 

    # print "Running", cmd, params 

    # ShellExecute() doesn't seem to allow us to fetch the PID or handle 
    # of the process, so we can't get anything useful from it. Therefore 
    # the more complex ShellExecuteEx() must be used. 

    # procHandle = win32api.ShellExecute(0, lpVerb, cmd, params, cmdDir, showCmd) 

    procInfo = ShellExecuteEx(nShow=showCmd, 
           fMask=shellcon.SEE_MASK_NOCLOSEPROCESS, 
           lpVerb=lpVerb, 
           lpFile=cmd, 
           lpParameters=params) 

    if wait: 
     procHandle = procInfo['hProcess']  
     obj = win32event.WaitForSingleObject(procHandle, win32event.INFINITE) 
     rc = win32process.GetExitCodeProcess(procHandle) 
     #print "Process handle %s returned code %s" % (procHandle, rc) 
    else: 
     rc = None 

    return rc 

def test(): 
    rc = 0 
    if not isUserAdmin(): 
     print "You're not an admin.", os.getpid(), "params: ", argv 
     #rc = runAsAdmin(["c:\\Windows\\notepad.exe"]) 
     rc = runAsAdmin() 
    else: 
     print "You are an admin!", os.getpid(), "params: ", argv 
     rc = 0 
    x = raw_input('Press Enter to exit.') 
    return rc 
if __name__ == "__main__": 
    if not isUserAdmin(): 
     runAsAdmin() 

, который запрашивает у пользователя администратора. разрешение, но у меня есть две основные проблемы, связанные с ним:

1. пользователь должен дать разрешение программы (проблематичными для pentesting)

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

Есть ли способ обойти это?

пс. окна 7 и нет прямого доступа

+0

Имеет ли Windows 7 что-либо в свойствах файла или панели управления, чтобы автоматически разрешать определенным программам по умолчанию повышенные привилегии? – NuclearPeon

+1

Только системная служба может обойти UAC, чтобы поднять администратора. Например, служба планировщика задач выполняет это, когда запрашиваются самые высокие привилегии. Таким образом, вы можете просто создать задачу для выполнения по требованию. – eryksun

ответ

3

Если у вас есть доступ к компьютерам этот скрипт работает на то вы можете следовать инструкциям в этой ссылке ...

http://www.howtogeek.com/124087/how-to-create-a-shortcut-that-lets-a-standard-user-run-an-application-as-administrator/

Это позволит обычному пользователю запустите конкретное приложение в качестве администратора. Я успешно использовал это руководство в других приложениях, но никогда не использовал сценарий python. Может работать для вас.

+0

Есть ли способ создать задачу в планировщике заданий из сценария python? –

+1

Ну, вы можете создать запланированную задачу из оболочки Windows cmd с помощью 'schtasks'. Поэтому теоретически вы должны использовать подпроцесс python для запуска команды schtasks. Вот ссылка, говорящая о том, как это сделать ... http://stackoverflow.com/questions/2725754/schedule-python-script-windows-7 – abaldwin99

+1

@RichardPaulAstley, при создании задачи используйте параметр '/ rl maximum', чтобы сделать он работает повышенным. Затем выполните задачу по запросу через 'schtasks.exe/run/tn [имя_программы]'. – eryksun