CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z zapisem plików na C: (prawa administratora)

Problem z zapisem plików na C: (prawa administratora)

dział ogólny

Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez RuntimeError200 » piątek, 25 listopada 2011, 05:10

Witam wszystkich.

Mam taki problem, że mój program "MojProgram" zapisuje pliki na dysku w katalogu gdzie jest zainstalowany, a więc standardowo C:\Program Files\MojProgram\
W XP nie było problemu, w Viście i 7 jest z tym problem.
Szukałem na forum i znalazłem, że program musi mieć prawa administratora, co moża osiągnąć plikiem manifest.
Ok, sprawdziłem, że jeśli uruchomię program z takimi prawami ("Uruchom jako administrator" z menu kontekstowego) to faktycznie jest ok i program fizycznie zapisuje pliki w tej lokalizacji, ale przecież wiadomo, że problem w tym, żeby program miał takie prawa od razu na stałe. No ale przynajmniej wiem, że to o to chodzi.

Na forum lub z odnośników podanych na forum znalazłem dwie treści pliku manifest, dla porządku podaję:

KOD text:     UKRYJ  
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
          manifestVersion="1.0">
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel
                level="highestAvailable"
                uiAccess="false"/>
        </requestedPrivileges>
    </security>
</trustInfo>
</assembly>


KOD text:     UKRYJ  
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.0.0.0"
        processorArchitecture="X86"
        name="MojProgram"
        type="win32"/>
<description>elevate execution level</description>
   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
      <security>
         <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
         </requestedPrivileges>
      </security>
   </trustInfo>
</assembly>


Niestety żaden z nich nie robi efektu praw administratora.
Oczywiście plik nazwałem tak jak program, czyli MojProgram.exe.manifest i jest w tym samym katalogu.
Próbowałem też różne wartości zmiennej requestedExecutionLevel (są trzy), ale nic to nie daje.
Co jest nie tak?

Odkryłem (mam Win Vista), że bez praw administratora program zapisuje i odczytuje pliki, ale nie tam gdzie pokazuje, czyli:
C:\ProgramFiles\MojProgram
tylko w:
C:\Users\MojaNazwaUzytkownika\AppData\Local\VirtualStore\Program Files\MojProgram

Jak go zmusić, żeby zapisywał tam, gdzie mu każę, czyli C:\ProgramFiles\MojProgram ?
Avatar użytkownika
RuntimeError200
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): piątek, 25 listopada 2011, 04:16
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista Home Premium 32
Kompilator: C++Builder 6 Personal
Gadu Gadu: 0
    Windows VistaOpera

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez scorp1on » piątek, 25 listopada 2011, 12:07

W xp zapisywanie działa bo użytkownik, który uruchamia program jest administratorem i może zapisywac w katalogu c:\program files\MojProgram.
Jak chcesz żeby w viscie było jak xp to wyłącz UAC i zrób użytkownika administratorem powinno zadziałać tak samo. Generalnie nie powinno się zapisywać w katalogu c:\program files\MojProgram tylko w katalogu użytkownika.
Można tez ustawić uprawnienienia do zapisywania c:\program files\MojProgram dla danego użytkownika.
Avatar użytkownika
scorp1on
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): poniedziałek, 14 lipca 2008, 23:30
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7, Ubuntu 10.10
Kompilator: C++ Builder 6 pro, C++ Builder 2010 pro
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez RuntimeError200 » piątek, 25 listopada 2011, 15:15

Ale jak mam wyłączyć komuś UAC?
Chodzi o to, że ktoś sobie ściągnie ten program i mam mu działać, żeby użytkownik nie musiał nic sam robić.
Moje pytanie brzmi co zrobić w programie, na poziomie jego tworzenia, żeby sam jako taki mógł zapisywać w Program Files.
Avatar użytkownika
RuntimeError200
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): piątek, 25 listopada 2011, 04:16
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista Home Premium 32
Kompilator: C++Builder 6 Personal
Gadu Gadu: 0
    Windows VistaOpera

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez Cyfrowy Baron » piątek, 25 listopada 2011, 18:45

To jest zabezpieczenie systemowe, jeżeli użytkownik nie ma odpowiednich uprawnień, to nie będzie mógł zapisać w tym folderze i nie ominiesz tego. W Program Files to się zasadniczo żadnych plików nie zapisuje. Napisz program w taki sposób by użytkownik miał dostęp do swoich plików C:\Users\MojaNazwaUzytkownika\AppData\Local\VirtualStore\Program Files\MojProgram.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez RuntimeError200 » sobota, 26 listopada 2011, 01:33

OK, ale czy w XP też jest taki folder?
Czy też jak podejrzewam może jest jakaś stała do wykorzystania w programie którą można zastosować w kodzie programu i która określa ten folder, gdziekolwiek on jest?
Avatar użytkownika
RuntimeError200
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): piątek, 25 listopada 2011, 04:16
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista Home Premium 32
Kompilator: C++Builder 6 Personal
Gadu Gadu: 0
    Windows VistaOpera

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez Cyfrowy Baron » sobota, 26 listopada 2011, 09:44

Nie ma dlatego pisząc program, który przechowuje pliki w folderze Program Files powinieneś tak go napisać by sprawdzał w jakim systemie został uruchomiony i zależnie od odpowiednio się ustawiał. Nie mam dostępu do Visty (i nie chcę mieć, gdyż to porażka) dlatego jestem ciekaw, czy użytkownik może edytować pliki dodane już do takiego katalogu.
Zastanawia mnie jeszcze jedno, skoro użytkownik nie może zapisywać plików w katalogu Program Files, to chyba też nie może instalować żadnych aplikacji, jak również nie może przekopiować tam żadnej aplikacji, więc nie wiem, czy Twoja próba obejścia tego problemu ma sens, skoro użytkownik i tak będzie musiał poprosić administratora o zainstalowanie aplikacji, to równie dobrze może go poprosić o udostępnienie katalogu programu do zapisu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez polymorphism » sobota, 26 listopada 2011, 10:47

RuntimeError200 napisał(a):Czy też jak podejrzewam może jest jakaś stała do wykorzystania w programie którą można zastosować w kodzie programu i która określa ten folder, gdziekolwiek on jest?

Możesz użyć zmiennej środowiskowej do określenia lokalizacji katalogu, gdzie aplikacja może składować swoje dane:
KOD cpp:     UKRYJ  
TCHAR buffer[MAX_PATH];

if(GetEnvironmentVariable(TEXT("appdata"), buffer, MAX_PATH))
{
        wcout << buffer << '\n';
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
RuntimeError200
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez Cyfrowy Baron » sobota, 26 listopada 2011, 11:59

Można też tak;

KOD cpp:     UKRYJ  
#define NO_WIN32_LEAN_AND_MEAN

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <shlobj.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 char SpecDir[MAX_PATH];
 SHGetSpecialFolderPath(NULL, SpecDir,  CSIDL_APPDATA, 0);
 Edit1->Text = (String)SpecDir;
}


KOD text:     UKRYJ  
 CSIDL_DESKTOP  // Pulpit
 CSIDL_PROGRAMS  // Menu Start\Programy
 CSIDL_PERSONAL  // Moje dokumenty
 CSIDL_FAVORITES  // <user name>\Ulubione
 CSIDL_STARTUP  // <user name>\Menu Start\Programy\Autostart
 CSIDL_RECENT  // <user name>\Recent
 CSIDL_SENDTO  // <user name>\SendTo
 CSIDL_STARTMENU  // <user name>\Menu Start
 CSIDL_MYMUSIC  // Moja muzyka
 CSIDL_MYVIDEO  // Moje video
 CSIDL_DESKTOPDIRECTORY  // <user name>\Pulpit
 CSIDL_NETHOOD  // <user name>\nethood
 CSIDL_FONTS  // Windows\Fonts
 CSIDL_TEMPLATES  // <user name>\Szablony
 CSIDL_COMMON_STARTMENU  // All Users\Menu Start
 CSIDL_COMMON_PROGRAMS  // All Users\Menu Start\Programy
 CSIDL_COMMON_STARTUP  // All Users\Autostart
 CSIDL_COMMON_DESKTOPDIRECTORY  // All Users\Pulpit
 CSIDL_APPDATA  // <user name>\Dane aplikacji
 CSIDL_PRINTHOOD  // <user name>\PrintHood

 CSIDL_CDBURN_AREA  // <user name>\\Ustawienia lokalne\Dane aplikacji\Microsoft\Nagrywanie dysków CD

CSIDL_LOCAL_APPDATA  // <user name>\Ustawienia lokalne\Dane aplikacji
CSIDL_COMMON_FAVORITES  // All Users\Ulubione

 CSIDL_INTERNET_CACHE  //<user name>\Ustawienia lokalne\Temporary Internet Files
 CSIDL_COOKIES  //<user name>\Cookies
 CSIDL_HISTORY  //<user name>\Ustawienia lokalne\Historia
 CSIDL_COMMON_APPDATA  // All Users\Dane aplikacji
 CSIDL_WINDOWS  // Windows
 CSIDL_SYSTEM  // Windows\System32 lub Windows\System (Win98)
 CSIDL_PROGRAM_FILES  // Program Files
 CSIDL_MYPICTURES  // Moje dokumenty\Moje obrazy

 CSIDL_PROFILE  // Documents and Settings\<user name>
 CSIDL_SYSTEMX86  // x86 Windows\System32
 CSIDL_PROGRAM_FILESX86  // x86 Program Files lub RISC

 CSIDL_PROGRAM_FILES_COMMON  // Program Files\Common Files

 CSIDL_PROGRAM_FILES_COMMONX86  // x86 Program Files\Common lub RISC
 CSIDL_COMMON_TEMPLATES  // All Users\Szablony

 CSIDL_COMMON_DOCUMENTS  // All Users\Dokumenty
 CSIDL_COMMON_ADMINTOOLS  // All Users\Menu Start\Programy\Narzędzia administracyjne

 CSIDL_COMMON_MUSIC  // All Users\Moje dokumenty\Moja muzyka
 CSIDL_COMMON_PICTURES  // All Users\Moje dokumenty\Moje obrazy
 CSIDL_COMMON_VIDEO  // All Users\Moje dokumenty\Moje video
 CSIDL_RESOURCES  // WINDOWS\resources

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
RuntimeError200
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez Corvis » poniedziałek, 28 listopada 2011, 19:33

"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House

Za ten post autor Corvis otrzymał podziękowanie od:
RuntimeError200
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez RuntimeError200 » poniedziałek, 28 listopada 2011, 21:42

Dzięki, już wszystko wiem.
Mógłby ktoś jeszcze sprawdzić, kto ma inny system (7, XP, Win98) jakie konkretnie lokalizacje (chodzi mi o ścieżkę dostepu) określa CSIDL_APPDATA i CSIDL_COMMON_APPDATA?

W Viście jest to:
CSIDL_APPDATA - C:\Users\(NazwaUzytkownika)\AppData\Roaming
CSIDL_COMMON_APPDATA - C:\ProgramData

Jak to wygląda w innych systemach?
Avatar użytkownika
RuntimeError200
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): piątek, 25 listopada 2011, 04:16
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista Home Premium 32
Kompilator: C++Builder 6 Personal
Gadu Gadu: 0
    Windows VistaOpera

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez polymorphism » poniedziałek, 28 listopada 2011, 23:12

WinXP SP2
  • CSIDL_APPDATA -> C:\Documents and Settings\{nazwa użytkownika}\Dane aplikacji
  • CSIDL_COMMON_APPDATA -> C:\Documents and Settings\All Users\Dane aplikacji
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
RuntimeError200
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez RuntimeError200 » wtorek, 29 listopada 2011, 04:33

Przyszła mi do głowy jeszcze jedna myśl...
Są przecież programy, które aktualizują się same przez internet, czyli ściągają plik wykonywalny programu i podmieniają stary na niego.
Wiem, że są takie, że ściągają instalkę i użytkownik jakby na nowo instaluje program, ale są i takie że po prostu musi się to odbywać poprzez podmianę exeka, zazwyczaj przy zamykaniu programu po ściągnięciu aktualizacji (stąd zwykle pojawia się komunikat aby ponownie uruchomić program). A więc musi istnieć jakiś sposób, aby program mógł podmienić swojego exeka, będąc oczywiście zainstalowanym w C:\Program Files.
Avatar użytkownika
RuntimeError200
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): piątek, 25 listopada 2011, 04:16
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista Home Premium 32
Kompilator: C++Builder 6 Personal
Gadu Gadu: 0
    Windows VistaOpera

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez Cyfrowy Baron » wtorek, 29 listopada 2011, 08:15

RuntimeError200 napisał(a):A więc musi istnieć jakiś sposób, aby program mógł podmienić swojego exeka


W sytuacjach o których piszesz program wyposażony jest w dodatkowy program w stylu update.exe i po prostu uruchamiany jest program do aktualizacji, a aktualizowana aplikacja jest zamykana. Często też ściągany jest po prostu patche, aplikacja aktualizowana uruchamia patche i sama kończy działanie, patche robi resztę. Patche do aktualizacji programu można w prosty sposób stworzyć za pomocą InstallShield.

Nie można dokonać modyfikacji pliku aktywnego procesu i nie licz na cuda.

RuntimeError200 napisał(a):Mógłby ktoś jeszcze sprawdzić, kto ma inny system (... Win98)


Tego to już chyba nikt nie używa. Nie starałbym się już tworzyć aplikacji pod ten system.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez polymorphism » wtorek, 29 listopada 2011, 12:07

Baron, jemu chodzi o to, że aplikacja update'ująca ma dostęp do folderu, do którego "normalna" aplikacja dostępu nie ma.

RuntimeError200, odpal aplikację w ten sposób:
KOD cpp:     UKRYJ  
ShellExecute(NULL, "runas", "ścieżka\\aplikacja.exe" , 0, 0, SW_SHOWNORMAL);

i zobacz, czy będzie miała dostęp do własnego katalogu tudzież innego katalogu chronionego. Oczywiście aplikacja powinna mieć załączony wspomniany wcześniej manifest.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z zapisem plików na C: (prawa administratora)

Nowy postprzez RuntimeError200 » wtorek, 6 grudnia 2011, 17:13

Czy mógłby ktoś z Win XP sprawdzić, czy nie wyskakuje mu błąd kompilując ten kod?

KOD cpp:     UKRYJ  
TCHAR buffer[MAX_PATH];
        AnsiString Sciezka = "";
        if(GetEnvironmentVariable(TEXT("ProgramData"), buffer, MAX_PATH))
                Edit1->Text = buffer;
        else
                MessageBox(0, "Błąd", "Błąd", MB_OK | MB_ICONERROR | MB_SYSTEMMODAL);
Avatar użytkownika
RuntimeError200
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): piątek, 25 listopada 2011, 04:16
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista Home Premium 32
Kompilator: C++Builder 6 Personal
Gadu Gadu: 0
    Windows VistaOpera

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron