C++でプログラムによってファイルの所有者を別のユーザーに設定しようとしています。
私は間違いなくSeRestorePrivilege
私のプロセスを有効にしました。これは、ProcessExplorerを使用して確認できます。プロセスを開始し、無効にし、コードを実行して有効にし、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;
}
ありがとうございました。
編集:あなたの継続的な支援に感謝します。よろしくお願いします。
次のすべてのテストにあなたのコードを使用しました。基本的に、私はあなたのコードからアクセス拒否メッセージも受け取りますが、もう少し追跡しました。
まず、「C:\ test.txt」は私の実際のコードではありませんでした。残念ながら、バックスラッシュがないことが問題の原因ではありません。でもあなたの鋭い目をありがとう:)
また、UACを無効にして管理者アカウントを実行していて、プログラムのマニフェストにrequireAdministratorが設定されています。
しかし、私のコードとあなたのコードの両方が単純なファイルで機能することに気づきました。多くのテストを行った結果、次のシナリオでのみAccessDeniedメッセージが表示されることがわかりました。
1:私は所有者ではなく、「TakeOwnership」権限はDeny foregEveryoneに設定されています。
2:私は所有者であり、「TakeOwnership」権限はDeny foregEveryoneに設定されています。不思議なことに、この2番目のインスタンスでは、失敗コードにもかかわらず、所有権の変更が実際に発生します。
なぜこれが起こっているのかわかりません。私とあなたは、プロセストークンにSE_RESTORE_NAMEを設定しました。所有者SIDを任意に設定できるようにする必要があります。しかし、私にはできないようです。
TakeOwnership DACLを拒否すると、所有権を取得する能力が無効になるようです。ただし、所有権を取得できるようになるまで、権限を変更することはできません。ため息。
最初に推奨したようにSeTakeOwnershipPrivilegeを設定し、自分自身に所有権を取得し、権限を変更し、外部で所有権を設定してみます。なんて痛い。そして、私はそれがうまくいくとはあまり確信していません。
私もこれを見つけました:http://us.generation-nt.com/setnamedsecurityinfo-failing-rc-1307-help-59729462.html
彼は同様の状況にあるようです(プロセストークンを適切に設定しないと1307になります)。ただし、CreatePrivateObjectSecurityExには、さらに多くの設定が必要です。
うーん。御時間ありがとうございます。