[Delphi] Zamknięcie dostępu do folderu

0

W wielu FAQ podany jest przykład zablokowania dostępu do folderu. Oki, ale jak odczytać z takiego folderu dane. Czy jest to możliwe i jak ??

uses ShellAPI;
 
procedure TForm1.Button1Click(Sender: TObject);
var Rekord:TSHFileOpStructA;
begin
  with Rekord do
  begin
   Wnd:=Handle;
   wFunc:=FO_RENAME;
   pFrom:='c:\Data';
   pTo:='c:\Data.{21EC2020-3AEA-1069-A2DD-08002B30309D}';
  end;
   if SHFileOperation(Rekord)<>0 then
   ShowMessage('Błąd')
end;
0

to jest zwykły folder o zmienionej nazwie ... są jakieś problemy ?
a dokładniej to jest "oszukanie" systemu że jest to skrót do panelu sterowania, ale tylko z poziomu zwykłego explorera nie można wejść do folderu
oczywiście oszukanie to to nie jest - bo to jest feature ;)

0

Adamo właśnie mi chodzi o zabezpieczenie dostępu. Tylko, że jak zabezpiecze to tyle z niego mam, że on istnieje i nic więcej. Wrzuciłem do niego image a z exe pobierałem obraz i nic - jakby go nie gbyło. Błąd brak pliku. Nie mam pojęcia czy u mnie tylko tak występuje.

0

a w tym exeku obraz pobierasz z folderu o zmienionej nazwie z tym dopiskiem clsid jako rozszerzenie czy dalej próbujesz się odwołać do folderu data :>

0

najpierw robiłem jak do zwykłego folderu, rzeczywiście będzie trzeba wykorzystać:
help
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp

Nie mam pojęcia jak to rozwiązać.

Image1.Picture.LoadFromFile((getp(CSIDL_CONTROLS))+'C:\Data\Obraz.bmp');

nie zadziała :( bo najpierw podaje ścieżkę do panelu sterowania a później inną. Jak ten kod powinien wyglądać prawidłowo.

0

Przecież z obsługą tego nie ma problemu. Robisz, na przykład:

CopyFile('c:\Dane.{21EC2020-3AEA-1069-A2DD-08002B30309D}\plik.txt', 'c:\plik.txt', TRUE);

..i działa. Pamiętaj, że teraz folder ma zmienioną nazwę.

0

dzięki

Image1.Picture.LoadFromFile('c:\Data.{21EC2020-3AEA-1069-A2DD-08002B30309D}\Obraz.bmp');

działa ;)

po prostu zasugerowałem się dostępem do szczególnych folderów CSIDL_CONTROLS to mnie zmyloło.
I odpowiadałem sobie właśnie tym, zamiast zobaczyć na początku, że zmienia się folder z Data na Data.21EC2 itd.
[soczek]

Mam jeszcze pytanko związane z tym, czy można odwrócić ten proces i utworzyć ponownie zwykły folder Data. Czy jak zastosuję taką zmianę, czy taki katalog przypuśćmy, żę przeniosę na inny komputer, czy będzie nadal miał przypisany panel sterowania.

0

Możesz normalnie zmienić mu nazwę z powrotem. To nie jest tak, że ten folder jest jakoś zmieniony. Po prostu CLSID informuje Explorer, że ikona oraz akcje mają być wzięte z obiektu Panelu sterowania - nic innego się nie zmienia. To normalny katalog. Po przeniesieniu na inny system Windows, katalog wciąż będzie miał nazwę z CLSID, więc ikona i akcje będą zmienione. Ale katalog ten nie jest zabezpieczony w rzeczywisty sposób. Przeglądanie z innego systemu operacyjnego, czy nawet spod konsoli Windows, pokazuje to jako całkowicie normalny katalog o nazwie z CLSID.

W Explorerze nie zmienisz nazwy, bo i Panel sterowania takiej akcji nie posiada, ale programowo czy spod konsoli nie ma z tym problemu.

0

A czy znasz inny sposób zabezpieczenia katalolu na system plików FAT32. Niektóre programy przypisują swoje ikony folderom, czy nie można byłoby w jakiś sposób zabezpieczyć folder w rejestrze systemu.

0

Na FAT32 nie ma stuprocentowej możliwości zabezpieczenia folderu. Można tylko polegać na niewiedzy użytkownika.

0

Chodzi mi o pewne utrudnienie, które ma polegać na tym aby użytkownik nie mógł skopiować zawartości foldera gdzieś sobie tam np. na pulpit. Nie ma to być w 100% zabezpieczenie tylko pewne utrudnienie.
Koleje pytanie, czy można przypisać ten folder swoją ikoną, aby ta nie kojarzyła się z panelem sterowania,
Jak programowo odwrócić proces - utworzyć folder przed przypisaniem do panelu sterowania.

Poradziłem sobie

var Rekord:TSHFileOpStructA;
begin
   with Rekord do
    begin
     Wnd:=Handle;
     wFunc:=FO_COPY;
     pFrom:='c:\Data.{21EC2020-3AEA-1069-A2DD-08002B30309D}';
     pTo:='c:\Data';
     fFlags:=FOF_NOCONFIRMMKDIR;
    end;
   if SHFileOperation(Rekord)<>0 then
     ShowMessage('Błąd')

Temat uważam za zamknięty

Dzięki

0

Tu masz opis, jak stworzyć własny obiekt z własną ikonką i podpisem, a także własnymi akcjami:

http://4programmers.net/Z_pogranicza/FAQ/%5BWindows%5D_Ikonka_w_oknie_M%C3%B3j_komputer_i_innych_folderach_specjalnych

Nie testowałem tworzenia plików z rozszerzeniem o danym CLSID, ale Panel sterowania jest zrobiony na właśnie takiej zasadzie, więc to też powinno działać.

Jeśli sprawdzisz, daj znać.

0

Stworzyłem programik, który tworzy plik *.reg i wpisuje generowane GUID. Podaję kod. Czy ktoś włączyłby się i uzupełnił kod o zmianę DWORD na wpisy w EDIT.

uses Ole2

procedure TMainForm.Button1Click(Sender: TObject);
var
  GU  : TextFile;
  Reg : TRegistry;
  Value : String;
  Guid: TGUID;
  CLSIDStr: PWideChar;
begin
  CoCreateGUID(Guid);
  StringFromCLSID(Guid, ClSIDStr);
  CLSID.Text := (CLSIDStr);
  AssignFile(GU, 'GUID'+CLSID.TEXT+'.reg'); // Tworzy plik GUID.REG
  ReWrite(GU);
  Reg := TRegistry.Create;
  try
    Writeln(GU, 'Windows Registry Editor Version 5.00');
    Writeln(GU, '');
    Writeln(GU, '[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\
    CurrentVersion\Explorer\MyComputer\NameSpace\'+CLSID.TEXT+']');
    Writeln(GU, '@="'+EDIT2.TEXT+'"');   // Folder specjalny
    Writeln(GU, '');
    Writeln(GU, '[HKEY_CLASSES_ROOT\CLSID\'+CLSID.TEXT+']');
    Writeln(GU, '@="'+EDIT3.TEXT+'"');   // Folder Specjalny - tekst tylko dla opisu
    Writeln(GU, '"InfoTip"=hex(2):49,00,6e,00,66,00,6f,00,54,00,69,00,70,00,20,00,66,00,6f,00,\');
    Writeln(GU, '  6c,00,64,00,65,00,72,00,75,00,00,00');
    Writeln(GU, '');
    Writeln(GU, '"SortOrderIndex"=dword:00000060');
    Writeln(GU, '"IntroText"=hex(2):49,00,6e,00,74,00,72,00,6f,00,54,00,65,00,78,00,74,00,20,00,\');
    Writeln(GU, '  66,00,6f,00,6c,00,64,00,65,00,72,00,75,00,00,00');
    Writeln(GU, '"LocalizedString"="'+EDIT4.TEXT+'"');  // Folder specjalny
    Writeln(GU, '');
    Writeln(GU, '[HKEY_CLASSES_ROOT\CLSID\'+CLSID.TEXT+'\DefaultIcon]');
    Writeln(GU, '@=hex(2):65,00,78,00,70,00,6c,00,6f,00,72,00,65,00,72,00,2e,00,65,00,78,00,65,\');
    Writeln(GU, '  00,2c,00,30,00,00,00');
    Writeln(GU, '');
    Writeln(GU, '[HKEY_CLASSES_ROOT\CLSID\'+CLSID.TEXT+'\Shell]');
    Writeln(GU, '@="'+EDIT5.TEXT+'"');  //
    Writeln(GU, '');
    Writeln(GU, '[HKEY_CLASSES_ROOT\CLSID\'+CLSID.TEXT+'\Shell\Open]');
    Writeln(GU, '@="'+EDIT6.TEXT+'"');  //  Otwórz mój folder
    Writeln(GU, '');
    Writeln(GU, '[HKEY_CLASSES_ROOT\CLSID\'+CLSID.TEXT+'\Shell\Open\Command]');
    Writeln(GU, '@="'+EDIT7.TEXT+'"');  //  explorer.exe c:\\
    Writeln(GU, '');
    Writeln(GU, '[HKEY_CLASSES_ROOT\CLSID\'+CLSID.TEXT+'\ShellFolder]');
    Writeln(GU, 'Attributes"=hex:40,00,00,02');
    Writeln(GU, '"CallForAttributes"=dword:00000040');
  finally
    Reg.Free;
    CloseFile(GU);
  end;
end;

Edit to: CLSID, Edit2 do Edit7

0

Czy mogę jakoś przypisać ścieżkę do pFrom i pTo? Żeby np. wpisać w Edit ścieżkę do folderu, zapisać ją do zmiennej i ją wstawić w pFrom i pTo tak aby zamieniało mi aktualnie wpisany folder. Próbowałem normalnie to zrobić ale zaraz Delphi krzyczy o typach, a ja już nie mam do tego nerwów. Wiecie może jak to zrobić?

0

kod do blokowania dostepu za pomoca komponentu doscommand:

 //blokada
  doscommand1:= TDosCommand.Create(form1);
  DosCommand1.CommandLine := 'cmd.exe';
  doscommand1.OutputLines:=memo1.lines;
  DosCommand1.Execute;
  DosCommand1.SendLine('CACLS '+d_kat.blok_dir+' /P '+user+':N', True);
  DosCommand1.SendLine('T', True);
  DosCommand1.SendLine('exit', True);

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