2017-01-25 6 views
1

Python関数を使用して、Windowsのシステムディレクトリ(C:\Windows)にファイルのリストをコピーしたい。WindowsでPython関数の管理者アクセスを依頼する

私が持っている機能:

import shutil 

def copy_list(src_list, dst): 
    for file in src_list: 
     shutil.copy(file, dst) 

をそして、私はこのようにそれを呼び出すようにしたい:どのように私はこれを達成することができます

def copy_as_admin(): 
    #... some code to obtain user elevation ... 

    copy_list(files_list, "C:\\Windows\") 

? PS:私はのpython3を使用していて、私は How to run python script with elevated privilege on windows 、このスレッドでのソリューションを試みたが、これらのソリューションは、Pythonのバージョン2.

+0

可能な重複(http://stackoverflow.com/questions/19672352/how-to-run-python-script-with-elevated-privilege- [ウィンドウ上のシステム特権でPythonスクリプトを実行する方法] Windows上で) – SiHa

+0

その解決策は、Pythonバージョン2です。そして、それはpython 3で動作していません。 – lpsandaruwan

+1

OK、あなたの質問に言及する必要があります。 – SiHa

答えて

1

次の例では、Cyrbilの優れた作品に基づいています。特に、2つの列挙が導入されています。 1つ目は、昇格したプログラムのオープン方法を簡単に指定することができ、2つ目はエラーを簡単に特定する必要がある場合に役立ちます。すべてのコマンドライン引数を新しいプロセスに渡したい場合は、sys.argv[0]をおそらく関数呼び出し:subprocess.list2cmdline(sys.argv)に置き換えてください。

#! /usr/bin/env python3 
import ctypes 
import enum 
import sys 


# Reference: 
# msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx 


class SW(enum.IntEnum): 

    HIDE = 0 
    MAXIMIZE = 3 
    MINIMIZE = 6 
    RESTORE = 9 
    SHOW = 5 
    SHOWDEFAULT = 10 
    SHOWMAXIMIZED = 3 
    SHOWMINIMIZED = 2 
    SHOWMINNOACTIVE = 7 
    SHOWNA = 8 
    SHOWNOACTIVATE = 4 
    SHOWNORMAL = 1 


class ERROR(enum.IntEnum): 

    ZERO = 0 
    FILE_NOT_FOUND = 2 
    PATH_NOT_FOUND = 3 
    BAD_FORMAT = 11 
    ACCESS_DENIED = 5 
    ASSOC_INCOMPLETE = 27 
    DDE_BUSY = 30 
    DDE_FAIL = 29 
    DDE_TIMEOUT = 28 
    DLL_NOT_FOUND = 32 
    NO_ASSOC = 31 
    OOM = 8 
    SHARE = 26 


def bootstrap(): 
    if ctypes.windll.shell32.IsUserAnAdmin(): 
     main() 
    else: 
     hinstance = ctypes.windll.shell32.ShellExecuteW(
      None, 'runas', sys.executable, sys.argv[0], None, SW.SHOWNORMAL 
     ) 
     if hinstance <= 32: 
      raise RuntimeError(ERROR(hinstance)) 


def main(): 
    # Your Code Here 
    print(input('Echo: ')) 


if __name__ == '__main__': 
    bootstrap() 
+0

多くのありがとう。これは魔法のように機能しました。 :-) – lpsandaruwan

0

ためには、Windows上で実行時に特権を変更することはできませんです。

アプリケーションにはマニフェスト(Pythonには適していません)が必要です。また、特権ユーザーとして実行する必要があります。

アプリが起動して特権が低すぎる場合は、管理者として実行するか、昇格された特権でアプリを起動させるように、runasを呼び出すことができます。

import ctypes 

if not ctypes.windll.shell32.IsUserAnAdmin(): 
    print('Not enough priviledge, restarting...') 
    import sys 
    ctypes.windll.shell32.ShellExecuteW(
     None, 'runas', sys.executable, ' '.join(sys.argv), None, None) 
    exit(0) 
else: 
    print('Elevated privilege acquired') 
+0

私は 'runas'にあなたが必要とするユーザ/権限レベルを伝える必要があると思います。これはデフォルトのユーザーとして実行されますが、それはありませんか? – SiHa

+1

runas.exe(つまり、「seclogon」サービス)は、UACが有効な場合、ユーザーの無制限の管理者トークンに昇格することはできません。これには、ctypesまたはPyWin32を使用して呼び出すことができる 'ShellExecute [Ex]' "runas"動詞(つまり "appinfo"サービス)が必要です。このアカウントを有効にし、パスワードを資格情報保管庫に格納した場合、runas.exeは管理者アカウント(RID 500)にログオンできることが最善です。デフォルトのUACポリシーは管理者アカウントを除外しています。そのため、このアカウントはWindows Vista以降はデフォルトで無効になっています。 – eryksun

関連する問題