6

I'm using win32com.client to create a shortcut on Windows:

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()

I would like the shortcut to be created with the "Run as administrator" checkbox on:

Shortcut with Run as administrator" checkbox on

Is it possible to do that using python and win32com?

I'm using python 3.5 on Windows 7 64bits.

Community
  • 1
  • 1
Periodic Maintenance
  • 1,698
  • 4
  • 20
  • 32

1 Answers1

1

Call the SetFlags method of the IShellLinkDataList interface to enable 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)

Example:

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)
Eryk Sun
  • 33,190
  • 5
  • 92
  • 111