我正在尝试编写一个备份和恢复工具。我在 WinPE CD ( http://en.wikipedia.org/wiki/Windows_Preinstallation_Environment ) 上运行我的代码。我正在尝试读取整个 C: 分区并将其写入网络。就像 tar 命令一样,但特定于 Windows。除了设置文件所有者外,我一切正常。Windows 似乎真的不能容忍未知 SID 拥有的文件。由于我在 WinPE 中运行,因此在 C: 上定义的大多数用户都不在本地用户数据库中。
以下是我尝试过的一些功能:
- SetFileSecurity(返回 1307)
- SetSecurityInfo(返回 1307)
- SetNamedSecurityInfo(返回 1307)
- 备份写入(返回 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;
}