以下のコードを使用して、ファイルの所有者を変更しています。このコードは、C#バージョン4.0で記述されたWindowsサービスで実行されます。ローカルサーバーで実行されており、Windows Server 2008 R2 Standard、ServicePack1を実行しています。
FTP経由で受信したファイルの所有者をドメインアカウントに変更する必要があります。ボックスにログインしてエクスプローラーを使用して手動で実行できますが、コードを介してこれを実行しようとすると、InvalidOperation例外が発生します。所有者をローカルシステムアカウントに変更できますが、ネットワークアカウントに変更することはできません。これに関する助けをいただければ幸いです。
私はEDIファイルを処理するいくつかの奇妙なMicrosoftDynamicsAXコードを使用しています。このプロセスでは、ファイルの所有者が有効なDAXユーザー(この場合はドメインユーザー)である必要があります。FTP経由でEDIデータを送信するベンダーがあります。DAXアプリケーションは10分ごとにFTPディレクトリをチェックし、ファイルを処理します。所有者が無効であるため、プロセスは現在失敗しています。そこで、ファイルが到着したときに所有者を変更するサービスを作成しました。ただし、以下のコードは、コード例の下にある例外を除いて失敗します。
var ediFileOwner = new NTAccount("MyDomain", _ediEndpointUserAccount);
var fileSecurity = File.GetAccessControl(fileName);
var everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
fileSecurity.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.FullControl, AccessControlType.Allow));
fileSecurity.AddAccessRule(new FileSystemAccessRule(ediFileOwner, FileSystemRights.TakeOwnership, AccessControlType.Allow));
fileSecurity.SetOwner(ediFileOwner); //Change our owner from to our desired User
File.SetAccessControl(fileName, fileSecurity);
完全な例外は次のとおりです。
System.InvalidOperationException: The security identifier is not allowed to be the owner of this object.
at System.Security.AccessControl.NativeObjectSecurity.Persist(String name, SafeHandle handle, AccessControlSections includeSections, Object exceptionContext)
at System.Security.AccessControl.NativeObjectSecurity.Persist(String name, AccessControlSections includeSections, Object exceptionContext)
at System.Security.AccessControl.NativeObjectSecurity.Persist(String name, AccessControlSections includeSections)
at System.Security.AccessControl.FileSystemSecurity.Persist(String fullPath)
at System.IO.File.SetAccessControl(String path, FileSecurity fileSecurity)
アップデート
サービスを実行しているアカウントを、所有者に変更しようとしているアカウントに変更すると、別の例外が発生します。
予期しない例外:System.UnauthorizedAccessException:許可されていない操作を実行しようとしました。System.Security.AccessControl.Win32.SetSecurityInfo(ResourceTypeタイプ、文字列名、SafeHandleハンドル、SecurityInfos securityInformation、SecurityIdentifier所有者、SecurityIdentifierグループ、GenericAcl sacl、GenericAcl dacl)