[WinAPI] bestand klonen inclusief toegangsrechten

Pagina: 1
Acties:

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 15-05 12:58

Tomatoman

Fulltime prutser

Topicstarter
Vanaf Office 95 kennen Officebestanden een structuur die tot ongebruikte ruimte in het bestand kan leiden. De oplossing om die ongebruikte ruimte uit het bestand te verwijderen is simpel:

1. tijdelijk bestand maken
2. alle structuren uit het oorspronkelijke bestand kopiëren (exclusief de lege ruimte)
3. oorspronkelijk bestand verwijderen
4. tijdelijk bestand de naam van het oorspronkelijke bestand geven

Nu geeft dit twee problemen als er specifieke NTFS-toegangsrechten voor het oorspronkelijke bestand zijn ingesteld. Ten eerste heeft het nieuwe bestand standaard toegangsrechten, die anders kunnen zijn dan de rechten van het oorspronkelijke bestand. Tussen stap 2 en 3 zouden daarom de toegangsrechten van het oorspronkelijke bestand naar het tijdelijke bestand gekopieerd moeten worden. Ik weet uit ervaring dat werken met access control lists een bezoeking is. Is er geen gemakkelijke manier om de toegangsrechten van bestand X over te nemen op bestand Y?

Ten tweede loop je bij stap 3 vast als de gebruiker geen rechten heeft om het bestand te verwijderen. Als je tussen stap 2 en 3 de bestandsrechten inmiddels hebt overgenomen op het tijdelijke bestand kun je dat ook niet meer verwijderen en kun je dus ook niet meer terug in de oorspronkelijke situatie. Er blijft dan een ongewenst bestand achter. Als je daarentegen eerst het oorspronkelijke bestand verwijdert en dan pas de toegangsrechten op het tijdelijke bestand overneemt, waarvan moet je ze dan eigenlijk overnemen 8)7? Ziet iemand een oplossing?

[ Voor 3% gewijzigd door Tomatoman op 24-01-2005 13:40 ]

Een goede grap mag vrienden kosten.


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 19:37

alienfruit

the alien you never expected

Ja, WordPerfect gebruiken oftewel niet gebruik maken van Word-formaat :D

[ Voor 63% gewijzigd door alienfruit op 24-01-2005 14:32 ]


  • The End
  • Registratie: Maart 2000
  • Laatst online: 21:32

The End

!Beginning

Waarom verwijder je niet gewoon de ruimte uit het bestand? Waarvoor moet dat in een nieuw bestand geschreven worden?

Je kan trouwens met GetKernelObjectSecurity de hele security descriptor ophalen en met SetKernelObjectSecurity em weer plaatsen op een andere file. (Er zijn er nog meer, maar werkt iig ook goed met backup en restore rechten)

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 15-05 12:58

Tomatoman

Fulltime prutser

Topicstarter
The End schreef op maandag 24 januari 2005 @ 14:48:
Waarom verwijder je niet gewoon de ruimte uit het bestand? Waarvoor moet dat in een nieuw bestand geschreven worden?
Bij structured storage files is in het bestand een soort bestands- en directorystructuur opgebouwd. Die structuur kan door schrijfbewerkingen gefragmenteerd raken. De enige manier om de structuur te defragmenteren is alle onderdelen kopiëren naar een ander bestand, waarmee je automatisch alle slack verwijdert. Bovendien is deze methode veilig, want als er halverwege wat misgaat heb je het origineel nog.
Je kan trouwens met GetKernelObjectSecurity de hele security descriptor ophalen en met SetKernelObjectSecurity em weer plaatsen op een andere file. (Er zijn er nog meer, maar werkt iig ook goed met backup en restore rechten)
Daar ga ik eens mee stoeien.

Een goede grap mag vrienden kosten.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Anders kun je ook nog overwegen om de oorspronkelijke file in te korten en te overschrijven. Dat is wel een extra schrijfstap (je moet het tijdelijke bestand echt over het origineel heen kopieren, in plaats van het alleen te verplaatsen) maar waarschijnlijk maakt dat voor deze toepassing weinig uit.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 15-05 12:58

Tomatoman

Fulltime prutser

Topicstarter
Met GetFileSecurity en SetFileSecurity lukt het me nu om de access control lists te kopiëren, met uitzondering van de SACL's (die auditering en dergelijke regelen). Daar moet ik nog even op puzzelen. De inhoud van het bestand kopiëren was al geen probleem. Nu zijn de bestandsattributen aan de beurt. Attributen zoals read-only en hidden zijn geen probleem, maar ik realiseerde me opeens dat ik ook moet overnemen of het oorspronkelijke bestand gecomprimeerd is, encryptie bevat en nog wat andere dingen. Dat roept meteen het volgende probleem op, want aan een bestand kunnen ook zogeheten 'data streams' worden gehangen. Die zal ik ook op de een of andere manier moeten kopiëren.

Houdt het dan nooit op? :| Een simpel bestand kopiëren is met één regel code te doen, maar een kloon maken die precies dezelfde eigenschappen heeft, vereist tientallen tot honderden regels code! Zijn er nog andere bestandseigenschappen die ik ook zou moeten overnemen?

Aangezien het allemaal zo ingewikkeld is, overweeg ik een andere aanpak:
1. backupkopie maken van het oorspronkelijke bestand
2. tijdelijk bestand maken
3. alle structuren uit het oorspronkelijke bestand kopiëren naar het tijdelijke bestand
(Hierbij wordt lege ruimte in het oorspronkelijke bestand niet meegekopieerd, zodat de kopie kleiner is dan het origineel.)
4. oorspronkelijke bestand inkorten tot de grootte van het tijdelijke bestand
5. inhoud van tijdelijke bestand kopiëren naar oorspronkelijke bestand
6. tijdelijke bestand verwijderen
7. backupkopie verwijderen
Als er nu wat misgaat tijdens stap 4 of 5 kan tenminste nog de backupkopie worden teruggezet.

Een goede grap mag vrienden kosten.


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
Heb je met compressie rekening te houden dan? Als het oorspronkelijke bestand gecomprimeerd was had jij 'm toch nooit zinnig uit kunnen lezen?

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • The End
  • Registratie: Maart 2000
  • Laatst online: 21:32

The End

!Beginning

riezebosch schreef op dinsdag 25 januari 2005 @ 14:02:
Heb je met compressie rekening te houden dan? Als het oorspronkelijke bestand gecomprimeerd was had jij 'm toch nooit zinnig uit kunnen lezen?
Dat is een standaard feature van NTFS. Bestanden worden on the fly gecomprimeerd en gedecomprimeerd als ze nodig zijn. Hetzelfde geldt voor encryptie.

Voor de TS. Waarom maak je niet een tijdeljik bestand om de veranderingen in aan te maken en als je dat gedaan hebt, dan plaats je alles weer terug in het originele bestand. (kan je zelfs eventueel nog even een backup van maken) --- Ik zie dat je dit allemaal al bedacht had :) ---

[ Voor 5% gewijzigd door The End op 25-01-2005 14:10 . Reden: oeps... niet goed gelezen ]


Verwijderd

Ja zou ook in word de optie "Snel opslaan" uit kunnen zetten. Dan wordt iedere keer het gehele bestand opgeslagen, en niet alleen de wijzigingen ( waardoor de fragmentatie optreedt )

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
The End schreef op dinsdag 25 januari 2005 @ 14:08:
[...]


Dat is een standaard feature van NTFS. Bestanden worden on the fly gecomprimeerd en gedecomprimeerd als ze nodig zijn. Hetzelfde geldt voor encryptie.

Voor de TS. Waarom maak je niet een tijdeljik bestand om de veranderingen in aan te maken en als je dat gedaan hebt, dan plaats je alles weer terug in het originele bestand. (kan je zelfs eventueel nog even een backup van maken) --- Ik zie dat je dit allemaal al bedacht had :) ---
Maar waarom zou je je hier druk om maken als dit een feature van NTFS is? Dan handeld die dat toch ook weer voor jou af? 8)7

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
riezebosch schreef op dinsdag 25 januari 2005 @ 15:19:
[...]

Maar waarom zou je je hier druk om maken als dit een feature van NTFS is? Dan handeld die dat toch ook weer voor jou af? 8)7
Ja, als je bij je nieuwe file de bit meekopieert.

Werkt SHFileOperation niet? Het attribuut FOF_NOCOPYSECURITYATTRIBS suggeert op z'n minst dat de default CopySecurityAttribs is.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 15-05 12:58

Tomatoman

Fulltime prutser

Topicstarter
Het heeft wat moeite gekost om het allemaal robuust te maken, maar het is zover. Het werkt :*).

Delphi:
1
2
3
4
5
6
7
{ CompactStructuredStorageFile compacts a structure storage file by
  reclaiming any wasted space inside the file. It does not compromize the
  contents of the file. The procedure requires exclusive access to the file.
  The calling process must have write access to the file. If an error
  occurs, an exception is raised. The function returns the file size
  reduction in bytes. }
function CompactStructuredStorageFile(const FileName: TFileName): Cardinal;

De broncode in Delphi is hier te downloaden:
unit met de implementatie
unit met resourcestrings

Als je Word- en Exceldocumenten alsmaar blijven groeien, zelfs als je alleen maar inhoud verwijdert, kun je ze met deze code weer laten krimpen zonder de inhoud te veranderen. De documenten uit de modernste Wordversies hebben zelf al een of andere truc ingebouwd om de bestanden niet te ver op te blazen, maar oude Wordversies maken er een puinhoop van. Bij een testje met een willekeurig bestand gemaakt in Word 97 werd de grootte met 46% gereduceerd (van 248 kB naar 134 kB). Blijkbaar bestaan oude Worddocumenten voor misschien wel de helft uit lucht.

Een goede grap mag vrienden kosten.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Misschien kun je er nog een command line tooltje om bouwen, dan is het voor eindgebruikers ook direct bruikbaar. (Ik denk dat de meeste mensen hier geen Delphi compiler hebben.)
Pagina: 1