バックアップおよびリカバリ ツールを作成しようとしています。WinPE CD ( http://en.wikipedia.org/wiki/Windows_Preinstallation_Environment ) でコードを実行しています。C: パーティション全体を読み取って、ネットワークに書き込もうとしています。tar コマンドと同じですが、Windows 固有です。ファイル所有者の設定を除いて、すべてが機能しています。Windows は、不明な SID によって所有されているファイルに対して本当に寛容ではないようです。私は WinPE で実行しているため、C: で定義されたほとんどのユーザーはローカル ユーザー データベースにありません。
ここに私が試した機能のいくつかがあります:
- SetFileSecurity (1307 を返す)
- SetSecurityInfo (1307 を返す)
- SetNamedSecurityInfo (1307 を返す)
- BackupWrite (1307 を返す)
- NtSetSecurityObject (0xC000005A を返す)
私はこれができることを知っています。SetACL ( http://helgeklein.com/setacl/ ) はそれを行うことができます。
では、質問です。ファイルの所有者を存在しないユーザー/SID に設定するにはどうすればよいですか? どんな助けでも大歓迎です!
これが私が試したコードのサンプルです:
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <sddl.h>
#include <aclapi.h>
#include <tchar.h>
INT _tmain(){
PSECURITY_DESCRIPTOR psdOwner = LocalAlloc(LPTR,SECURITY_DESCRIPTOR_MIN_LENGTH);
if (InitializeSecurityDescriptor(psdOwner,SECURITY_DESCRIPTOR_REVISION)){
PSID psOwner = (PSID)0;
if (ConvertStringSidToSid(TEXT("S-1-5-21-3626571138-2175758104-1447827851-1013"),&psOwner)){
if (SetSecurityDescriptorOwner(psdOwner,psOwner,FALSE)){
DWORD dwError = SetNamedSecurityInfo(TEXT("test.txt"),SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,psdOwner,NULL,NULL,NULL);
if (dwError == ERROR_SUCCESS){
_tprintf(TEXT("Success!\n"));
}else{
_tprintf(TEXT("Failed to set owner: %u\n"),dwError);
}
}else{
_tprintf(TEXT("Failed to set owner into SD: %u\n"),GetLastError());
}
}else{
_tprintf(TEXT("Failed to covnert Sid string to Sid: %u\n"),GetLastError());
}
if (psOwner) LocalFree(psOwner);
}else{
_tprintf(TEXT("Failed to initialize SD: %u\n"),GetLastError());
}
if (psdOwner) LocalFree(psdOwner);
return 0;
}