Restaure un fichier ou un répertoire qui a été sauvegardé en utilisant _WinAPI_BackupRead()
#include <WinAPIFiles.au3>
_WinAPI_BackupWrite ( $hFile, $pBuffer, $iLength, ByRef $iBytes, ByRef $pContext [, $bSecurity = False] )
$hFile |
Handle du fichier ou du répertoire à restaurer. Pour obtenir le handle, appelez la fonction _WinAPI_CreateFileEx(). Les SACL ne sont pas restaurés à moins que le handle du fichier a été créé avec le droit d'accès $ACCESS_SYSTEM_SECURITY. Pour être sûr que les ACE d'intégrité soient restaurés correctement, le handle du fichier doit également avoir été créé avec le droit d'accès $WRITE_OWNER. |
$pBuffer | Le pointeur sur la mémoire tampon à partir duquel la fonction écrira les données. |
$iLength | La taille de la mémoire tampon, en octets. La taille de la mémoire tampon doit être supérieure à la taille de la structure $tagWIN32_STREAM_ID. (Voir MSDN pour plus d'informations) |
$iBytes | Le nombre d'octets écrit. |
$pContext |
Un pointeur sur une structure de données interne utilisée par cette fonction pour maintenir des informations de contexte pendant l'opération de restauration. Vous devez définir cette variable à 0 avant le premier appel à _WinAPI_BackupWrite() pour le fichier ou le répertoire spécifié. La fonction alloue de la mémoire à la structure de données, puis définit la variable qui pointe sur cette structure. Vous ne devez pas modifier cette variable ou la variable qui pointe sur cette structure entre les appels à _WinAPI_BackupWrite(). |
$bSecurity | [optionnel] Indique si la fonction restaurera la Liste des Contrôles d'Accès (ACL) des données, les valeurs valides sont: True - Les données ACL seront restaurées. En outre, vous devez spécifier les accès $WRITE_OWNER et $WRITE_DAC accès lors de l'ouverture du handle du fichier ou du répertoire. Si la handle ne possède pas ce droit d'accès, le système d'exploitation refuse l'accès aux données de l'ACL, et la restauration des données de l'ACL ne se produira pas. False - Les données de l'ACL seront omis (par défaut). |
Succès: | Retourne True. |
Échec: | Retourne False, appelez _WinAPI_GetLastError() pour obtenir des informations sur l'erreur. |
_WinAPI_BackupWrite() n'est pas destinée à la restauration de fichiers cryptés sous le système Encrypted File System (EFS).
Lorsque vous avez fini d'utiliser _WinAPI_BackupWrite(), vous devez appeler la fonction _WinAPI_BackupWriteAbort() avec le paramètre approprié pour libérer la mémoire occupée par la structure de données interne.
Consultez BackupRead dans la librairie MSDN.
#include <MsgBoxConstants.au3> #include <WinAPIFiles.au3> #include <WinAPIHObj.au3> #include <WinAPIMem.au3> #include <WinAPIProc.au3> #include <WinAPIShPath.au3> Local Const $sFile = @ScriptFullPath ; Active les droits "SeBackupPrivilege" et "SeRestorePrivilege" pour effectuer la sauvegarde et la restauration Local $hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY)) Local $aAdjust, $aPrivileges[2] = [$SE_BACKUP_NAME, $SE_RESTORE_NAME] _WinAPI_AdjustTokenPrivileges($hToken, $aPrivileges, $SE_PRIVILEGE_ENABLED, $aAdjust) If @error Or @extended Then MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Erreur', 'Vous n'vez pas les droits requis.') Exit EndIf ; Crée un tampon de mémoire dans lequel stocker les données de sauvegarde Local $iBytes = 4096 + FileGetSize($sFile) Local $pBuffer = _WinAPI_CreateBuffer($iBytes) ; Sauvegarde un fichier, y compris les informations de sécurité Local $pContext = 0 Local $hFile = _WinAPI_CreateFileEx($sFile, $OPEN_EXISTING, $GENERIC_READ) If Not _WinAPI_BackupRead($hFile, $pBuffer, $iBytes, $iBytes, $pContext, 1) Then MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Erreur', 'Impossible de faire un backup du fichier.') Exit EndIf _WinAPI_BackupReadAbort($pContext) _WinAPI_CloseHandle($hFile) ; Restaure un fichier (.bak) et les données de l'ACL $pContext = 0 $hFile = _WinAPI_CreateFileEx(_WinAPI_PathRenameExtension($sFile, '.bak'), $CREATE_ALWAYS, BitOR($GENERIC_WRITE, $WRITE_DAC, $WRITE_OWNER)) If Not _WinAPI_BackupWrite($hFile, $pBuffer, $iBytes, $iBytes, $pContext, 1) Then MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Erreur', 'Impossible de restaurer le fichier.') Exit EndIf _WinAPI_BackupWriteAbort($pContext) _WinAPI_CloseHandle($hFile) ; Libére la mémoire utilisée _WinAPI_FreeMemory($pBuffer) ; Restaure les droits par défaut "SeBackupPrivilege" et "SeRestorePrivilege _WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust) _WinAPI_CloseHandle($hToken)