Come impostare “Esegui questo programma come amministratore” al livello di programmazione

Sto avendo un problema con il buon vecchio bdeadmin.exe in Vista. Per prima cosa, prendiamo le risposte prevedibili fuori dagli schemi:

“Non dovresti richiedere che la tua applicazione sia elevata.”
Questo fa. È la vita.

“Devi incorporare un file manifest.”
È già compilato, ha molti anni, l’azienda che lo ha creato non ha intenzione di farlo di nuovo, ed è installato da un Merge Module (file MSM).

“BDE è obsoleto, dovresti usare dbExpress”
Un milione e mezzo di linee di codice. ‘Nuff ha detto.

Msgstr “Rilascia un file manifest vicino all’EXE”.
Ho provato, non ho fatto nulla. Come test, lo stesso file manifest è stato in grado di fare in modo che molti altri file EXE richiedessero l’elevazione, ma non quello che volevo. Qualcosa dentro impedisce che il manifest esterno venga letto.

“Crea un collegamento e imposta SLDF_RUNAS_USER.”
Non può farlo, è un’applet del pannello di controllo.

L’unica cosa che funzionava era impostare “Esegui questo programma come amministratore” nella scheda Compatibilità della finestra Proprietà. Non dovrei dovere dire agli utenti di fare questo. Male per gli affari. Ho bisogno che l’installatore faccia questo. Il file MSM utilizza un percorso statico.

Puoi impostare a livello di codice il flag “Esegui questo programma come amministratore” (l’opzione che trovi nella scheda Compatibilità delle proprietà di un EXE), impostando una semplice chiave di registro. È necessario creare un valore stringa (REG_SZ) sotto una di queste chiavi (se si desidera che l’impostazione sia per utente o per macchina, rispettivamente):

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers

o

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers

Il nome del valore deve essere il percorso completo dell’eseguibile (se il percorso contiene spazi, non racchiudere il percorso con le virgolette) e i dati del valore devono contenere la stringa RUNASADMIN .

Per esempio:

 reg.exe Add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\Program Files\MyApp\Test.exe" /d "PUT__VALUE__HERE" 

Modalità di compatibilità

WIN95 Windows 95
WIN98 Windows 98
WIN4SP5 Windows NT 4.0 SP5
WIN2000 Windows 2000
WINXPSP2 Windows XP SP2
WINXPSP3 Windows XP SP3
VISTARTM Vista
VISTASP1 Vista SP1
VISTASP2 Vista SP2
WIN7RTM Windows 7
WINSRV03SP1 Windows Server 2003 SP1
WINSRV08SP1 Windows Server 2008 SP1

Livello di privilegio

RUNASADMIN Esegui il programma come amministratore

REG AGGIUNGI “HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers” / v “C: \ temp \ compatmodel \ iconsext.exe” / t REG_SZ / d “WINXPSP3 RUNASADMIN” / f

Riferimenti: http://www.verboon.info/2011/03/running-an-application-as-administrator-or-in-compatibility-mode/

Questo è un campo lungo, ma se hai la parola “setup” o “install” nel nome dell’EXE, Windows richiederà l’elevazione durante l’esecuzione. Non so se funzionerà con un’applet del pannello di controllo, comunque.

Hai provato l’ Application Compatibility Toolkit di Microsoft? Analizza la tua app e fornisce shim di compatibilità che potrebbero aiutarti a risolvere il tuo problema.

Utilizzare un programma di avvolgimento che utilizza ShellExcute che utilizza “runas” come “verbo” per eseguire il programma desiderato.

Ho trovato che il metodo file .manifest non funziona se l’ .exe è in C:\Program files\... e l’ .exe è stato precedentemente eseguito senza il file .manifest . Windows ricorda il .manifest dalla prima esecuzione di .exe . Questo significa che non puoi semplicemente inviare il manifest quando gli utenti si lamentano che le loro installazioni non vengono eseguite. Il file manifest deve essere posizionato prima o durante la stessa installazione che inserisce l’ .exe .

Windows ricontrolla il .manifest se cambia l’ .exe (ad es. Nuova versione o numero diverso di byte)

Confeziona la tua app in WinRar SFX con modalità silenziosa + modalità richiesta amministratore.

Molto più semplice del fare scherzi con le variabili .MSI.

Sarei sorpreso se fosse ansible. Sarebbe un modo ideale per il codice dannoso per abusare del sistema. Probabilmente avrai intenzione di dire all’utente che l’amministratore deve installare o che devono avere i diritti di amministratore (come tutti gli altri programmi su Windows).