Avatar billede kennethjohnsen Nybegynder
08. marts 2010 - 15:09 Der er 10 kommentarer

Mit program får ikke lov at skrive i c:\ProgramData

Jeg har lavet et setup-projekt i Visual Studio 2008, der installerer mit program, og lægger en XML-fil i c:\ProgramData\Firma\Program\

Dette virker sådan set fint nok.

Men mit program har brug for at skrive til denne XML-fil, og det får det ikke lov til.

Er der en måde jeg kan give det lov til det, gerne som en del af installationen?

Ellers, er der et andet sted man kan gemme sådanne data?

Jeg vil helst undgå at lægge det i en brugers application-data mappe, da opsætningen i XML-filen skal gælde for alle brugere.


Mvh. Kenneth.
Avatar billede arne_v Ekspert
09. marts 2010 - 03:26 #1
Hvilken Windows version?
Avatar billede kennethjohnsen Nybegynder
09. marts 2010 - 10:51 #2
Det er Windows 7 her på min maskine.
Men det skulle gerne være sådan at det kan køre på alle versioner fra XP og og.

Jeg har læst lidt om, at man kan ændre rettighederne på undermapper i ProgramData, så alle brugere kan skrive i dem (og deres filer), men hvordan gør man det i et setup-projekt i VS2008?

Jeg har desuden fundet noget om, at man kan sætte hvilken rettighed programmet ønsker, i manifest-filen, og den burde så kunne køre med flere rettigheder end standard, og dermed kunne skrive i ProgramData?

Jeg har to EXE-filen. Den ene er det omtalte program, der skal kunne skrive i XML filen.

Det andet er en, der skal sættes til at køre som scheduled task. Denne skal bare kunne læse XML filen, hvilket ikke er et problem.


Mvh. Kenneth.
Avatar billede kennethjohnsen Nybegynder
09. marts 2010 - 12:50 #3
Nu har jeg fundet frem til at jeg kan skrive følgende i app.manifest, der ligger under Properties mappen i mit projekt:

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

Dette vil bevirke at Mit GUI program, der skal skrive til ProgramData, vil spørge om det må lave ændringer på computeren.

Herefter kan det godt skrive til filen.

Men jeg kom lige i tanke om, at det andet program, der skal køre som scheduled task, også har brug for at kunne skrive, da det skal skrive i en log-fil.

Og her sidder der jo ikke nogen bruger klar til at trykke "Yes" :-(
Avatar billede bvli Praktikant
09. marts 2010 - 13:33 #4
Jeg vil mene, at du har de problemer fordi det helst ikke *skal* være muligt for dig :)

Har du overvejet at lave 'all-users' settings'ne som readonly i din app.config og så lave en separat settings-fil til hver bruger, som så kan overskrive standardinstillingerne.

Du får god hjælp til dette hvis du bruger de indbyggede Settings i dit projekt.
Avatar billede kennethjohnsen Nybegynder
09. marts 2010 - 13:41 #5
Det har jeg overvejet.

Problemet er, at ved normal drift, skal programmet bare køre som scheduled task.

Der bør dog være mulighed for at starte det fra f.eks. kommandolinie, så man kan teste.

Ligemeget hvem man kører det som, skal det læse/skrive i samme XML og log-fil. Det havde jeg egentlig troet at CommonApplicationData (c:\ProgramData på Win7) var beregnet til.
Avatar billede kennethjohnsen Nybegynder
09. marts 2010 - 13:46 #6
Jeg tror ikke jeg kan bruge settings, da det er to EXE-filer der skal læse samme fil. Ellers var det ideelt.
Men hvad vi jeg lægger det i brugeren Application Data? Er der så skriverettighed som default?
Avatar billede bvli Praktikant
09. marts 2010 - 13:53 #7
Ja - men det er lavet for dig i Settings. Der sætter du også op hvad default-værdier er - og hvor værdierne skal gemmes (user/application).

Du kan få dem til at læse samme settings - hvis det er samme exe-fil.

Så du kan lave en en parameter der skal med når det kører som kommandolinie - og hvis ikke du får denne parameter med, starter du bare op som windows forms.
Avatar billede kennethjohnsen Nybegynder
09. marts 2010 - 13:59 #8
Det var da en idé.
Jeg tror relativt nemt jeg kan lave dem til én EXE.
Det ville bare være nemmere hvis jeg kunne bruge min XML-fil, da det er rimeligt komplekse data der ligger.
Avatar billede kennethjohnsen Nybegynder
09. marts 2010 - 14:56 #9
Hm. Nu har jeg prøvet at lægge følgende kode i Form_Load:

            System.IO.DirectoryInfo dir = new DirectoryInfo(CommonDir());

            dir.GetAccessControl().AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule("BUILTIN\\Users",System.Security.AccessControl.FileSystemRights.Modify,System.Security.AccessControl.AccessControlType.Allow ));


Det ser ved første øjekast ud til at virke.

CommonDir() er en hjælpemetode der returnerer stien til den mappe mit program skal kunne skrive i (c:\ProgramData\Firma\Program).

Men hvorfor stejlen kan det lade sig gøre at ændre rettigheder til mappen fra kode?

Jeg har endda fjernet:

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

og sat det tilbage til:

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

i app.manifest.
Avatar billede kennethjohnsen Nybegynder
10. marts 2010 - 11:58 #10
Ah. Det var fordi jeg ikke skrev AccessRule'n tilbage med SetAccessControl.

Det så bare ud som om det kunne lade sig gøre, fordi Jeg manuelt havde sat rettigheder på den ovenliggende mappe.

Hvis jeg kalder SetAccessControl, får jeg godt nok en fejl hvis jeg har "asInvoker" som requestedExecutionLevel.

Min løsning lige nu er, at mit GUI-program har "highestAvailable" som requestExecutionLevel, hvorved det beder om højere rettigheder ved opstart, og dette program skal man starte én gang først. Her stiller den AccessControl til Modify for "BUILTIN\Users", og brugeren kan så rette i XML-filen.

Herefter er der også skriveadgang for det program, der kører som scheduled task med requestedExecutionLevel sat til "asInvoker", da alle brugere nu har skriverettigheder til mappen.

Det er ikke en optimal løsning, men det var det bedste jeg lige kunne komme på for at have et fælles sted hvor begge programmer kan skrive, ligemeget hvilken bruger de kører under.


Mvh. Kenneth.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester