Я пытаюсь установить владельца файла другому пользователю программно на С++.
Я определенно включил SeRestorePrivilege
для своего процесса. Я могу подтвердить это с помощью Process Explorer. Я запускаю процесс, он отключен, я запускаю свой код, чтобы включить его, ProcExp сообщает, что он включен, я дохожу только до точки, где нужно установить владельца, и он все еще включен (т.е. я не случайно отключаю Это).
Что еще может быть причиной этого сообщения об отказе в доступе? Что я не учел?
std::wstring fileSystemObject = L"C:\test.txt";
*status_code = SetNamedSecurityInfo((wchar_t*)fileSystemObject.c_str(), SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION, pSID, NULL, NULL, NULL);
if (*status_code == ERROR_SUCCESS)
{
Log(L"Successfully set owner for " + fileSystemObject);
return true;
}
else
{
Log(L"Failed to set owner for " + fileSystemObject + L". Error code: ", *status_code);
return false;
}
Спасибо.
EDIT: Большое спасибо за вашу постоянную помощь. Это очень ценится.
Я использовал ваш код для всех следующих тестов. По сути, я также получаю сообщения об отказе в доступе из вашего кода, однако я немного отследил его.
Во-первых, "C:\test.txt" не был моим настоящим кодом, и, к сожалению, отсутствующая обратная косая черта не является причиной моей проблемы. Но спасибо за зоркий взгляд :)
Кроме того, я использую учетную запись администратора с отключенным UAC, и в моей программе в манифесте установлен параметр requireAdministrator.
Однако я заметил, что и мой код, и ваш работают для простых файлов. После долгих испытаний я обнаружил, что получаю сообщения AccessDenied только в следующих сценариях:
1: я не являюсь владельцем, и для разрешений «Взять во владение» установлено значение «Запретить», например. Все.
2: я являюсь владельцем, и для разрешения «Взять на себя ответственность» установлено значение «Запретить», например. Все. Любопытно, что во втором случае, несмотря на код ошибки, смена владельца действительно происходит.
Я не понимаю, почему это происходит. Я и вы установили SE_RESTORE_NAME в маркере процесса. Мне должно быть разрешено произвольно устанавливать SID владельца. Но, кажется, я не могу.
Кажется, что любой отказ в DACL TakeOwnership переопределяет мою способность стать владельцем. Однако я не могу изменить разрешения, пока не стану владельцем! вздыхает.
Я мог бы попробовать установить SeTakeOwnershipPrivilege, как вы изначально рекомендовали, взять на себя ответственность, изменить разрешения, установить право собственности извне. Какая боль. И я даже не очень уверен, что это сработает.
Я также нашел это: http://us.generation-nt.com/setnamedsecurityinfo-failing-rc-1307-help-59729462.html
Кажется, он находится в похожей ситуации (я получаю 1307, если неправильно настрою токен процесса). Но CreatePrivateObjectSecurityEx требует гораздо больше настройки.
Хммм. Спасибо за ваше время.
SeTakeOwnershipPrivilege
? stackoverflow.com/a/5454795/868014 - person Roman R.   schedule 09.09.2012C:\t
, а неC:\\t
? Я подумал, что у вас также может быть повышение привилегий, чтобы это удалось. - person Roman R.   schedule 09.09.2012SE_TAKE_OWNERSHIP_NAME
кажется решением. Он подумал, что может потребоваться взять на себя ответственность, а затем временно удалить DACL, но нет, просто сработала дополнительная привилегия: обновленный код. - person Roman R.   schedule 09.09.2012