2012-09-04 1 views
5

Prima di tutto ciao, e grazie per le molte volte che la ricerca qui mi ha aiutato o mi ha insegnato qualcosa.L'app concorrente installa nella stessa cartella della mia, senza richiedere privilegi di amministratore

Ho creato un HUD personalizzato per un gioco che gioco e sto lavorando su un programma di installazione in C#, ispirato da un altro HUD per lo stesso gioco. Si scarica e sovrascrive tutti i file di script per la directory esistente:

C:\Program Files (x86)\Steam\steamapps\me\team fortress 2\tf 

[non ho alcun controllo su quale cartella da utilizzare, purtroppo, dal momento che sto modificando i file che ha installato Valve]

In per eliminare le cartelle, aggiungere cartelle, o copiare i file, ho dovuto usare un app manifesta per aumentare le autorizzazioni utente ogni volta che viene lanciato l'exe:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 

In qualche modo, il programma di installazione mi è stato ispirato da sta installando nella stessa cartella che sono, senza forzare g un prompt UAC.

La sua applicazione mostra solo un avviso di protezione, ma se io deselezionare la casella di controllo "controllare sempre", posso farlo funzionare più e più volte, senza dover verificare eventuali permessi speciali di

http: //www.trishtech .com/img_art_a/win7_publisher_not_verified_0.jpg & gt;? ">

Qualche suggerimento su come posso fare la mia app più senza soluzione di continuità come il suo ho contattato l'autore del altra applicazione, e lui dice che è anche utilizzando C# ma non sa nulla di speciale che sta facendo per farlo funzionare

EDIT: Alcune cose che so sto facendo in modo diverso, nel caso in cui fanno la differenza in qualche modo:

  • Sto utilizzando un browser di file per decidere dove mettere i miei file, quindi l'applicazione può essere eseguita da qualsiasi luogo.
    • Li sta semplicemente esportando nella stessa directory dell'exe, richiedendo che l'exe sia inserito nella cartella di destinazione.
  • Sto utilizzando ILMerge per raggruppare SharpZipLib con la mia app.
    • Sta lasciando la DLL nel file zip accanto al file exe.
+0

Potrebbe avere qualcosa a che fare con il reindirizzamento dei dati UAC: http://windowsteamblog.com/windows/b/developers/archive/2009/08/04/user-account-control-data-redirection.aspx – Simon

+0

Per scrivere a 'Programmi ', è necessario elevare. Molto probabilmente l'altra applicazione non scrive in "Programmi" in realtà ma piuttosto in una virtualizzata. Controlla se i file sono realmente modificati con l'altra applicazione. Controlla anche il VirtualStore: 'C: \ Users \% USERNAME% \ AppData \ Local \ VirtualStore', le versioni _" aggiornate "dei file sono molto probabilmente in' VirtualStore'. –

+0

Questi sono alcuni argomenti molto interessanti da esaminare, grazie – appski

risposta

3

Se si sta tentando di scrivere a "C: \ Program Files (x86)" Allora necessità diritti di amministratore. Ne consegue che l'altra app non deve creare file lì, ma in una directory che non è protetta dal controllo dell'account utente.

Se i file sono per utente, è possibile creare una sottocartella nella cartella appdata e salvarli lì.

Convenzione è quello di creare una cartella per indentity l'azienda e un altro per l'identità del prodotto,

esempio

var dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 
      + "\\MyCompanyName\\MyApplicationName"; 
+0

Ho intenzione di contrassegnare questo come la risposta corretta, dal momento che è probabilmente il consiglio giusto per quasi ogni altra persona con questa domanda. Tuttavia le mie scoperte sono un po 'estranee, e le posterò in un'altra risposta per i posteri. – appski

2

Sta solo di riproporli nella stessa directory come l'exe, che richiede l'exe da inserire nella cartella di destinazione.

Non credo che lo sarà. La stessa directory exe non dovrebbe essere diversa, hai o non hai autorizzazioni.

La risposta "normale" sarebbe, scrivere in una directory a cui si ha il permesso. Ma questo non è sempre possibile.

Se si eseguiva l'applicazione come servizio, si aprirà una sola finestra di Windows, ma ciò non sembra corretto per il proprio caso d'uso.

Non credo che ci sia un modo corretto per sopprimere un messaggio del genere, è come una situazione di catch 22. Per fare qualcosa che non puoi fare, devi ottenere il permesso (quindi elevare l'utente -> popup UAC).

+0

Sì, è frustrante. Troppi fattori limitanti su questo progetto, altrimenti penso che ci siano stati molti buoni consigli su come evitare questo genere di cose. Analizzerò anche i servizi, anche se sì, potrebbe essere un po 'pesante per questa piccola app. – appski

0

Sto contrassegnando la risposta di sgmoore come quella giusta, anche se il mio caso sembrava essere un po 'estraneo e voglio documentarlo anche io.

Ho ridotto il mio programma alle basi e fatto molti esperimenti. Ho capito che per qualche ragione, lui e io in realtà posso copiare file e creare cartelle in quella directory. Forse è qualcosa di speciale nella cartella steamapps, o forse è solo un bug che sta facendo funzionare effettivamente in questo caso limitato, quando normalmente non dovrebbe essere usato per programmi "reali".

Ciò che in realtà richiede il prompt UAC, stranamente, stava eseguendo l'exe dalla cartella \ Bin \ Debug \ in cui inizialmente il mio progetto lo stava generando. Se muovo il mio exe da qualche altra parte e poi lo eseguo, funziona perfettamente. Anche se eseguo il suo exe dalla mia cartella \ Bin \ Debug \, non funziona neanche lui. Non sono stato in grado di capire perché sia ​​così.

Qualcos'altro che ho notato è che quando la mia app avrà successo senza un'eccezione, non richiede l'avviso di sicurezza quando lo avvio. Si apre silenziosamente e poi funziona. Ogni volta che visualizza l'avviso di sicurezza, fallisce.

Immagino che il protocollo sarebbe quello di trasformare questi due problemi in nuove domande, ma a questo punto sembra che sia probabilmente nel territorio di edgecase/hack dal momento che tutti concordate sul fatto che questo non dovrebbe nemmeno funzionare affatto.

Ho intenzione di ricostruire il mio programma e vedere se riesco ancora a farlo funzionare con tutte le funzionalità in queste circostanze strane, o se dovrò riabilitare l'elevazione UAC.

+0

L'avviso di sicurezza è in genere perché l'exe è stato contrassegnato come scaricato da Internet e non è attendibile e quindi attiva il prompt UAC. Se sblocchi il file, viene eseguito dalla cartella bin \ debug? Non riesco a capire perché spostare il file risolva il problema a meno che non lo si sposti su un Fat Drive. – sgmoore

+0

http://tinyurl.com/9gymcbz vuoi dire sbloccarlo come questo esempio giusto? Non ho il pulsante sulle mie proprietà. – appski

+0

Sì, era quello che intendevo. Se il pulsante non è lì, deve essere un problema diverso. – sgmoore