1

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には、さらに多くの設定が必要です。

うーん。御時間ありがとうございます。

4

1 に答える 1

2

ここでの問題は、セキュリティサブシステムとモデルが不当な所有権の変更からオブジェクトを保護しており、管理者権限を持っていても、障害を正しく克服する必要があることです。

ファイルの所有権の取得には、との2つの特権がありSE_TAKE_OWNERSHIP_NAMEますSE_RESTORE_NAME。前者は誰かの物を奪うことを可能にし、後者はセッター自身ではない所有者を設定することを可能にします。

SE_RESTORE_NAMEより強力な特権であり、タスクには十分であるように見えるかもしれませんが、そうではないようです。はい、MSDNが述べているように、誰かの所有権を設定することができます。

呼び出し元にSeRestorePrivilege定数がない場合(特権定数を参照)、このSIDは呼び出し元のトークンに含まれている必要があり、SE_GROUP_OWNER権限が有効になっている必要があります。SecurityInfoパラメータには、OWNER_SECURITY_INFORMATIONフラグが含まれている必要があります。所有者を設定するには、呼び出し元がオブジェクトへのWRITE_OWNERアクセス権を持っているか、SE_TAKE_OWNERSHIP_NAME特権が有効になっている必要があります。

ただし、所有権の変更を明示的に防止するDACLアイテムを克服することはできません。この場合、他の特権も必要です(つまり、両方を有効にする必要があります)。これにより、誰に与えるかを決める前に、誰かから所有権を取得できます。

上記のコメントからC++/ ATLソースコードへのリンクをコピーしています:SetFileOwner.cpp。権限/DACLに拒否項目がある場合、例外が発生し、2番目の特権を有効にすると問題が解決します。

于 2012-09-09T17:17:27.197 に答える