2016-05-05 28 views
3

でWindowsエクスプローラのショートカットを作成します。私はWindows上のショートカットを作成するwin32com.clientを使用している管理者として実行

from win32com.client import Dispatch 

shell = Dispatch("WScript.Shell") 
shortcut = shell.CreateShortCut(shortcut_path) # shortcut_path defined elsewhere 
shortcut.Targetpath = target_path 
shortcut.WorkingDirectory = working_directory # working_directory defined elsewhere 
shortcut.save() 

私は上の「管理者として実行」チェックボックスを使用して作成されるショートカットをしたいと思います。

Shortcut with Run as administrator" checkbox on

それはPythonとwin32comを使用していることを行うことは可能ですか?

私はWindows 7 64ビット版でpython 3.5を使用しています。

答えて

0

コールIShellLinkDataListインターフェースのSetFlags方法はSLDF_RUNAS_USER有効にする:

import pythoncom 
from win32com.shell import shell, shellcon 

def create_link(link_path, target_path, description=None, directory=None, 
       runas=False): 
    link = pythoncom.CoCreateInstance(
       shell.CLSID_ShellLink, 
       None, 
       pythoncom.CLSCTX_INPROC_SERVER, 
       shell.IID_IShellLink) 
    link.SetPath(target_path) 
    if description is not None: 
     link.SetDescription(description) 
    if directory is not None: 
     link.SetWorkingDirectory(directory) 
    if runas: 
     link_data = link.QueryInterface(shell.IID_IShellLinkDataList) 
     link_data.SetFlags(link_data.GetFlags() | shellcon.SLDF_RUNAS_USER) 
    file = link.QueryInterface(pythoncom.IID_IPersistFile) 
    file.Save(link_path, 0) 

def set_link_runas(link_path): 
    link_data = pythoncom.CoCreateInstance(
        shell.CLSID_ShellLink, 
        None, 
        pythoncom.CLSCTX_INPROC_SERVER, 
        shell.IID_IShellLinkDataList) 
    file = link_data.QueryInterface(pythoncom.IID_IPersistFile) 
    file.Load(link_path) 
    flags = link_data.GetFlags() 
    if not flags & shellcon.SLDF_RUNAS_USER: 
     link_data.SetFlags(flags | shellcon.SLDF_RUNAS_USER) 
     file.Save(link_path, 0) 

例:

if __name__ == '__main__': 
    import os 
    import sys 

    desktop_path = shell.SHGetFolderPath(0, shellcon.CSIDL_DESKTOP, 0, 0) 
    profile_path = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, 0, 0) 
    version = '.'.join(str(x) for x in sys.version_info[:3]) 
    description = "Python %s" % version 
    target_path = sys.executable 
    # test 1 
    link_path = os.path.join(desktop_path, description + '(1).lnk') 
    create_link(link_path, target_path, description, profile_path, True) 
    # test 2 
    link_path = os.path.join(desktop_path, description + '(2).lnk') 
    create_link(link_path, target_path, description, profile_path) 
    set_link_runas(link_path) 
関連する問題