2010-04-13 9 views
7

J'installe un raccourci sur le bureau (vers un fichier batch) à partir d'un programme d'installation basé sur WiX - comment configurer automatiquement ce raccourci avec le paramètre "Exécuter en tant qu'administrateur" activé? Le système d'exploitation cible est Windows Server 2008 R2 et le programme d'installation s'exécute avec des privilèges élevés.Comment installer un raccourci sur le bureau (vers un fichier batch) à partir d'un programme d'installation basé sur WiX sur lequel "Exécuter en tant qu'administrateur" est activé?

Mise à jour:
Merci à le lien fourni par @Anders, j'ai pu obtenir ce travail. Je devais faire cela dans un C# CustomAction, voici donc la version C# du code:

namespace CustomAction1 
{ 
public class CustomAction1 
{ 
    public bool MakeShortcutElevated(string file_) 
    { 
    if (!System.IO.File.Exists(file_)) { return false; } 

    IPersistFile pf = new ShellLink() as IPersistFile; 
    if (pf == null) { return false; } 

    pf.Load(file_, 2 /* STGM_READWRITE */); 
    IShellLinkDataList sldl = pf as IShellLinkDataList; 
    if (sldl == null) { return false; } 

    uint dwFlags; 
    sldl.GetFlags(out dwFlags); 
    sldl.SetFlags(dwFlags | 0x00002000 /* SLDF_RUNAS_USER */); 
    pf.Save(null, true); 
    return true; 
    } 
} 

[ComImport(), Guid("00021401-0000-0000-C000-000000000046")] 
public class ShellLink { } 

[ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("45e2b4ae-b1c3-11d0-b92f-00a0c90312e1")] 
interface IShellLinkDataList 
{ 
    void AddDataBlock(IntPtr pDataBlock); 
    void CopyDataBlock(uint dwSig, out IntPtr ppDataBlock); 
    void RemoveDataBlock(uint dwSig); 
    void GetFlags(out uint pdwFlags); 
    void SetFlags(uint dwFlags); 
} 
} 
+1

Merci pour poster votre solution! J'avais vraiment besoin de ça. – Ben

+0

ne pas oublier: using System.Runtime.InteropServices.ComTypes; – David

Répondre

6

Je devine que vous auriez besoin d'une action personnalisée et d'appeler les interfaces COM sur votre propre. Requête IShellLink (ou IPersistFile?) Pour IShellLinkDataList, puis: IShellLinkDataList->SetFlags(orgFlagsFromGetFlags|SLDF_RUNAS_USER);

Edit: Raymond a le code de l'échantillon complet sur ses blog

Questions connexes