2010-02-22 18 views
27

Sto riscontrando un problema con il buon vecchio bdeadmin.exe in Vista. Per prima cosa, prendiamo le risposte prevedibili fuori dagli schemi:Come impostare "Esegui questo programma come amministratore" a livello di programmazione

"Non è necessario che l'applicazione sia elevata."
Questo fa. È la vita.

"È necessario incorporare un file manifest."
È già compilato, ha molti anni, la società 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.

"Eliminare un file manifest accanto all'EXE."
Provato, non ha 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."
Impossibile farlo, è un'applet del pannello di controllo.

L'unica cosa che ha funzionato 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.

+0

La risposta accettata ha le posizioni del registro da leggere per i valori desiderati. – Patrick

+0

Non è necessario ricompilare (o ricollegare) solo per incorporare un manifest. È una risorsa regolare che puoi aggiungere come qualsiasi altra risorsa. A meno che il binario non sia firmato digitalmente e non possa essere modificato, questa sarebbe la soluzione semplice. Ri-imballare questo in un nuovo modulo di unione dovrebbe essere fattibile pure. – IInspectable

+0

Riguardo al ~ per Win 8: noto sul mio Win 7 che c'è un # (cancelletto) seguito dallo spazio seguito da RUNASADMIN, quindi molto probabilmente è un ~ (tilda) su Win 8. E (chissà quale nuovo simbolo) su windows 10 ... –

risposta

35

È possibile impostare a livello di codice il flag "Esegui questo programma come amministratore" (l'opzione che si trova nella scheda Compatibilità delle proprietà di un EXE), impostando una chiave di registro semplice. È necessario creare un valore stringa (REG_SZ) sotto uno di questi tasti (se si desidera che l'impostazione sia per utente o per macchina, rispettivamente):

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

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) ei 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 di 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 SP1
WINSRV08SP1 Windows Server 2008 SP1

Privilege Level

programma RunAsAdmin Run
WIN7RTM Windows 7
WINSRV03SP1 Windows Server 2003 come un amministratore

REG ADD "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/

+0

Questo sembra promettente. Ora per ottenere quello in [COMMONFILESFOLDER] in un msi – Patrick

+0

L'unico bit sticky sta usando la variabile MSI nel nome del valore del registro. Questo è vuoto. Ma hai risposto alla mia domanda, grazie. Utilizzerò% commonprogramfiles% e% commonprogramfiles (x86)% in due valori diversi finché quella parte non verrà risolta. – Patrick

+0

Potresti voler aprire una domanda separata per il tuo enigma MSI. So dai miei rapporti con MSI che non ne so nulla, soprattutto perché trovo la sua documentazione piuttosto scialba. Quando colpisco un muro, di solito butto tutto ciò che devo fare in un'azione personalizzata (che è ridicolmente facile da fare, almeno con .NET). –

-1

Sarei sorpreso se fosse possibile. 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).

+8

Non sembra che tu abbia avuto il tempo di capire la domanda.Sta cercando di far funzionare la sua applicazione come amministratore con un utente che ha diritti di amministratore su una macchina con UAC abilitato. Nel suo stato attuale, la sua app non richiede elevazione e funziona senza diritti di amministratore e fallisce. Sta cercando di indurlo a chiedere l'elevazione, non a bypassare la sicurezza di Windows. –

1

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

+0

Interessante. Potrei riuscire a unire il contenuto del loro MSI generato con il mio programma di installazione. – Patrick

+0

No, non ha funzionato. Chiudi, però. – Patrick

6

Questo è un campo lungo, ma se si ha 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.

+1

OMG, cappello fuori e scudi a voi. :) – John

+0

anche "aggiornamento" ... questo può essere trovato in questo articolo [Capire e configurare il controllo dell'account utente in Windows Vista] (http://technet.microsoft.com/en-us/library/cc709628 (WS.10) .aspx) in * Installer Detection Technology * (non sono disponibili ancore) – Wolf

1

utilizzare un programma che utilizza involucro ShellExcute che utilizza dei "runas" come il suo "verbo" per eseguire il programma che si desidera.

1

ho trovato che il metodo file non funziona se il .exe è sotto C:\Program files\... e la .exe è stato eseguito in precedenza senza il file . Windows ricorda lo dalla prima volta che viene eseguito il .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 colloca lo .exe.

di Windows ricontrolla i se il .exe modifiche (ad esempio nuovo rilascio o diverso numero di byte)

+0

Sembra interessante, potrei trovare qualche informazione in più qui: [Scopri perché il tuo manifesto esterno viene ignorato .] (http://csi-windows.com/blog/all/27-csi-news-general/245-find-out-why-your-external-manifest-is-being-ignored) – Wolf

0

Pack la vostra applicazione in WinRar SFX con modalità di richiesta amministratore modalità silenziosa +.

Molto più semplice che con le variabili .MSI.

Problemi correlati