Dostęp do dysku C z poziomu programu jako administrator

0

Co trzeba dodać do programu żeby zapisać plik na dysku C. Z jakich bibliotek API skorzystać . Ponieważ jak uruchamiam program przez prawy klawisz myszy "Uruchom jako administrator" to zapisuje na dysku c dane. Ale chcę żeby bez tego chodziło.

0

Niezbyt dokładnie opisałeś sprawę, więc z tego co się domyślam chodzi Ci o możliwość bezproblemowego zapisywania na partycji C:, czyli uruchomienie programu z prawami administratora; Jeśli tak, to dołącz do zasobów programu odpowiedni manifest (do pobrania stąd) - dzięki niemu możliwe będzie określenie poziomu uprawnień i tym samym rozwiązanie problemu;

Jeśli nie trafiłem z odpowiedzią to opisz problem dokładniej, jak widać nikomu do tej pory nie chciało się zgadywać;

0

Tak jak napisałeś chodzi mi o nadanie mojemu programowi Uprawnień admina, żebym mógł mieć dostęp do dysku C. Ponieważ tam jest zainstalowany mój program w katalogu program files i chcę pewne pliki aktualizować. Ale abym mógł to zrobić muszę program mieć uruchomiony jako ADMINISTRATOR. Bo inaczej nie aktualizują się pliki. Czyli interesuje mnie jakie procedury muszę uruchomić z api żeby mógł robić zmiany na dysku c:.. Bo przykład który podał kolega jest osobnym plikiem dołączanym razem z programem. A chciał bym aby program zapytał o podniesienie uprawnień lub po prostu je zmienił. Tak jak to jest w total commanderze..... Pokazuje jak ma kopiować pliki czy jako admin czy normalnie.
I zastanawiam się czy jest to wykonalne.

0

Tak jak napisałeś chodzi mi o nadanie mojemu programowi Uprawnień admina, żebym mógł mieć dostęp do dysku C.

No to Ci piszę, że należy dodać do zasobów programu specjalny manifest, w którym określone są warunki uprawnień - można od razu uruchomić program z rządaniem podwyższenia uprawnień przez Level="requireAdministrator", lub tylko i wyłącznie na żądanie (podczas działania aplikacji);

Bo przykład który podał kolega jest osobnym plikiem dołączanym razem z programem.

No a jak inaczej chcesz to zrobić? Musisz dodać ten manifest, innej drogi raczej nie ma (przynajmniej nie jest mi znana);

A chciał bym aby program zapytał o podniesienie uprawnień lub po prostu je zmienił. Tak jak to jest w total commanderze..... I zastanawiam się czy jest to wykonalne.

Powtarzam: manifest z requireAdministrator;

0

Czy ktoś wie jak sprawdzić czy uruchomiony nasz program ma prawa administratora, Chodzi mi o stosowne wyświetlenie komunikatu. Rozumiem że można dodać manifesty ale w przypadku kiedy go nie ma chce poinformować, że brak uprawnień.

1

http://msdn.microsoft.com/en-us/library/windows/desktop/bb776463%28v=vs.85%29.aspx ale to czy użytkownik konkretnie program to używam znalezionej gdzieś w sieci funkcji (kod w Delphi):

function TfrmMain.IsAdmin: Boolean;
var
  hAccessToken: THandle;
  ptgGroups: PTokenGroups;
  dwInfoBufferSize: DWORD;
  psidAdministrators: PSID;
  x: Integer;
  bSuccess: BOOL;
begin
  Result   := False;
  bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,
    hAccessToken);
  if not bSuccess then
  begin
    if GetLastError = ERROR_NO_TOKEN then
      bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,
        hAccessToken);
  end;
  if bSuccess then
  begin
    GetMem(ptgGroups, 1024);
    bSuccess := GetTokenInformation(hAccessToken, TokenGroups,
      ptgGroups, 1024, dwInfoBufferSize);
    CloseHandle(hAccessToken);
    if bSuccess then
    begin
      AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
        SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0, psidAdministrators);
      {$R-}
      for x := 0 to ptgGroups.GroupCount - 1 do
        if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
        begin
          Result := True;
          Break;
        end;
      {$R+}
      FreeSid(psidAdministrators);
    end;
    FreeMem(ptgGroups);
  end;
end;
0

Dziękuje za szybką odpowiedz. Ale ten program pokazuje czy użytkownik jest zalogowany jako admin. A mi chodzi o to czy mój program napisany po uruchomieniu ma nadane prawa administratora. W sensie czy może zapisywać na dysku c. Żebym mógł poinformować użytkownika.

0

O ile się orientuje ze swoich programów pod WinAPI. To jeżeli dodasz odpowiedni manifest, który wymusza takie prawa to bez potwierdzenia program się nie uruchomi. Natomiast to czy zapis się powiódł lub czy nastąpił jakiś błąd sprawdzic przez funkcję GetLastError po wywołaniu CreateFile. Więcej informacji znajdziesz oczywiście w google i na MSDNie. Do wymuszenia praw Amina korzystam z wygooglowanego kiedyś manifestu i o ile wiem ze swoich testów to sprawdza się ok.

<?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> 
<v3:trustInfo xmlns:v3="urn:schemas-microsoft-com:asm.v3">
  <v3:security>
    <v3:requestedPrivileges>
      <v3:requestedExecutionLevel level="requireAdministrator" />
    </v3:requestedPrivileges>
  </v3:security>
</v3:trustInfo>
</assembly>

Ważne jest tylko w przypadku korzystania ze starszych wersji na przykład Delphi 7. Aby plik *.rc z manifestem nie był jakąś stałą = 24 tylko bezpośrednio 24. Ponieważ spotkałem się z sytuacją iż po kompilacji jako stała COSTAM_MANIFEST bez przypisania liczby 24, manifest się dodał do zasobów, ale nie był widoczny pod na przykład TotalCommanderowym listerem albo HIEW lub podglądem z filemanagera FAR - na koncu pliku. Przez co program uruchomiony na systemie z włączonym UAC, nie wymusił by tych praw. Także plik z definicją zasobów może wyglądać tak:

#define IDI_MAINICON 100
1 24 "admin_rights_request.manifest"
IDI_MAINICON ICON DISCARDABLE "app_icon.ico"
0

Wracam do tego tematu. Mam pytanko czy ktoś wie do jakich systemów potrzeba praw administratora do zapisu na dysku c?

0

Pojęcie „dysku C” występuje tylko w systemach wywodzących się z DOS-a. Sam DOS nie miał czegoś takiego jak „prawa administratora”, a pod Windowsami ograniczenia zapisu występują od Visty: więc Windows Vista, Windows 7, Windows 8, Windows 8.1 oraz Windows 10.

@Azarien był na tyle miły, że mnie wyprowadził z błędu — vide późniejsze posty i komentarze pod nimi w tym temacie. tl;dr; jest takie, że już od Windowsa XP włącznie zapis do katalogów nadrzędnych (tzn. C:\plik) wymaga podwyższenia uprawnień.

0

@Althorion: nie do końca. Od systemu Windows Vista wzwyż istnieje mechanizm zwany UAC, natomiast braku uprawnień do zapisu w danej lokalizacji można doświadczych również we wcześniejszych wersjach okienek, co było by zależne od administratora systemu, a nie od jakiejś tam usługi kontroli użytkownika.

3
Althorion napisał(a):

pod Windowsami ograniczenia zapisu występują od Visty: więc Windows Vista, Windows 7, Windows 8, Windows 8.1 oraz Windows 10.

Nie. Prawa dostępu pod Windows istnieją od początku istnienia Windows NT, z którego wywodzi się linia Windows 2000, XP, Vista itd.

To co się zmieniło pod Vistą, to UAC powodujący że domyślnie, nawet użytkownik będący adminem, nie ma mocy admina póki nie wypowie zaklęcia.
Ale i wcześniej ciągła praca na koncie admina nie była zalecana — a ponieważ wielu (zwłaszcza użytkowników domowych) tak robiło, dlatego wprowadzono UAC by admin nie był przez cały czas „uzbrojony”.

0

@furious programming: mogę źle coś pamiętać, bo windowsiarzem nie jestem, ale mam wrażenie, że Vista i późniejsze systemy wprowadziły domyślne ustawienia takie, że żeby zapisywać do „folderu nadrzędnego” (tzn. bezpośrednio na partycję, w sensie C:\plik czy inne F:\cokolwiek; w odróżnieniu od np. D:\folder\plik) trzeba mieć uprawnienia admina — i chyba o to @piter2004 pytał).

0

@Althorion: OP pytał o opcję Uruchom jako administrator, która istniała już w systemach z rodziny NT :]

0

Chodzi o to, że na dysku c:\Program Files\program\pliki Chcę utworzyć katalog 'pliki' , gdzie będą zapisywane pliki. I moje pytanie jest takie czy z poziomu programu mogę utworzyć taki katalog 'pliki' i co jeśli nie mam konta admina i czy mogę tam zapisywać swoje pliki. Co z każdego systemu musze sprawdzić, żeby sobie z tym problemem poradzić.

1

Wracając do tematu.

piter2004 napisał(a):

Mam pytanko czy ktoś wie do jakich systemów potrzeba praw administratora do zapisu na dysku c?

Pojęcie „dysku C:” oznacza że chodzi o Windowsa. Zatem odpowiedź brzmi: w każdym, z wyjątkiem Windows 9x i poprzedników.
Czyli musisz założyć że w każdym.

Możesz wyłączyć UAC i pracować na koncie admina udawając że problem nie istnieje, ale wtedy i tak potrzeba praw administratora - tyle tylko że je masz.
Teoretycznie możesz też nadać uprawnienia zapisu na C: zwykłemu użytkownikowi (nie rób tego), ale by to zrobić i tak potrzeba praw administratora.

0

Czyli jak konkretnie muszę zrobić, żeby zapisywać pod wszystkimi windowsami pliki w katalogu 'c:\Program Files\program\pliki'.

2
piter2004 napisał(a):

Czyli jak konkretnie muszę zrobić, żeby zapisywać pod wszystkimi windowsami pliki w katalogu 'c:\Program Files\program\pliki'.

Ale co tam chcesz zapisywać? Wiesz o tym, że zapisywanie jakichkolwiek danych w tej lokalizacji to zła praktyka? Jedyny sensowny przypadek kiedy widzę aby program tam zapisywał to aplikacja aktualizacyjna. Takie programy powinny po prostu być uruchamiane z podwyższonymi uprawnieniami. Do celu zapisu danych przez program Windows przewiduje inne lokalizacje, gdzie użytkownik posiada uprawnienia do zapisu bez innych zabiegów jak nadawanie uprawnień.

0

Do celu zapisu danych przez program Windows przewiduje inne lokalizacje, gdzie użytkownik posiada uprawnienia do zapisu bez innych zabiegów jak nadawanie uprawnień.

Rozwijając - np. katalog z ustawieniami lokalnymi lub gałąź użytkownika w rejestrze. Oczywiście jeśli chodzi o dane dotyczące np. ustawień programu - dla każdego użytkownika osobny zestaw.

0

Chcę w programie w katalogu przechowywać logi i pliki dlatego chciałem je mieć w katalogu gdzie mam swój program. Jaki katalog byście polecili do zapisywania tych plików chodzi mi o konkretnty.

1

%AppData% do tego służy.

2

Lub gałąź HKEY_CURRENT_USER w rejestrze.

A jeśli chodzi o lokalizację na dysku to zależy od tego, czy pliki mają być współdzielone pomiędzy użytkownikami i też komputerami. Możesz wybrać jedną z trzech opcji - przekleję tekst z innego wątku:

CSIDL_APPDATA (FOLDERID_RoamingAppData) is for data that is accessible to the calling thread's current user account (which can be impersonated) on multiple machines (hense "roaming" data).

CSIDL_LOCAL_APPDATA (FOLDERID_LocalAppData) is for data that is accessible to the calling thread's current user account on the local machine only (hense "local" data).

CSIDL_COMMON_APPDATA (FOLDERID_ProgramData) is for data that is accessible to any user account on the local machine only (not "roaming" data).

0

Proponuję utworzyć podkatalog w %localappdata% albo %appdata% i tam zapisywać pliki.

Możesz pobrać ścieżkę za pomocą SHGetFolderPath albo SHGetKnownFolderPath (ta druga wymaga co najmniej Visty).
https://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx

1

Jeśli chodzi np. o katalog %localappdata% to warto też zaznaczyć, że obowiązuje ogólnie przyjęta (choć niestety nie zawsze przestrzegana) struktura podkatalogów w tej lokalizacji. Według mnie głównie ze względu na zmniejszenie prawdopodobieństwa kolizji nazw - żeby dwie aplikacje niechcący nie modyfikowały swoich plików.

Sugerowana struktura podkatalogów jest prosta, np. %localappdata%\manufacturer\application\, gdzie:

  • %localappdata% - ścieżka określana przez funkcję systemową,
  • manufacturer - nazwa firmy, organizacji lub po prostu autora oprogramowania,
  • application - nazwa aplikacji (pełna lub skrócona, jak kto woli).

Wewnątrz podkatalogu application, nasz program powinien zapisywać swoje lokalne dane. Podobnie wygląda to w przypadku korzystania z rejestru systemu. Przykład: HKCU lub HKLM\Software\manufacturer\application\.

1 użytkowników online, w tym zalogowanych: 0, gości: 1