DOBON.NET DOBON.NETプログラミング掲示板過去ログ

アクセス権の無いフォルダの所有権を取得したい

環境/言語:[Windows7 .NET Framework4]
分類:[.NET]

エクスプローラで、アクセス権のないフォルダの所有権を取得し、
アクセス権をつけてアクセス可能となる操作をVB.NETで作成したいと考えています。

そこで以下の様なコードを作成しました。(まだアクセス権を設定する部分は書いてありません)

Dim DirectoryInfo As New IO.DirectoryInfo("C:\Acc")
Dim DirectorySecurity As Security.AccessControl.DirectorySecurity = DirectoryInfo.GetAccessControl()
DirectorySecurity.SetOwner(New System.Security.Principal.NTAccount("builtin\administrators"))
DirectoryInfo.SetAccessControl(DirectorySecurity)

このコードでは、アクセス権があって所有権を変更する場合には正常に動作しますが、
アクセス権がない場合にはGetAccessControlの部分でエラーとなってしまいます。

どのように書き換えればアクセス権のない状態で所有権を取得できるかご教授ください。
> どのように書き換えればアクセス権のない状態で所有権を取得できるかご教授ください。

  Win7 等なら、管理者権限が必須になるはず。
  一度、管理者権限を付与してみて実行したらどうなりますか?

  因みに、アクセス権のないフォルダって、どこを言っているので
  しょうか・・・場所によっては無理な場合がありますヨ!(多分)

以上。
■No31804に返信(オショウさんの記事)
>>どのように書き換えればアクセス権のない状態で所有権を取得できるかご教授ください。
>
>   Win7 等なら、管理者権限が必須になるはず。
>   一度、管理者権限を付与してみて実行したらどうなりますか?
>
>   因みに、アクセス権のないフォルダって、どこを言っているので
>   しょうか・・・場所によっては無理な場合がありますヨ!(多分)
>
> 以上。

返答有難うございます。

自分はファイルサーバの管理をしているのですが、
ユーザにはアクセス権を変更できる設定にしています。
時々、ユーザがアクセス権の継承を外してユーザ個人だけのアクセス権がついた状態にしてしまいます。
すると管理者権限を持った自分でもアクセス出来ない場所が出来上がる寸法です。

これの状態を解消するために、
管理者が所有権を取得し、管理者のアクセス権を付加するプログラムが作りたかった次第です。
> ユーザにはアクセス権を変更できる設定にしています。
> 時々、ユーザがアクセス権の継承を外してユーザ個人だけのアクセス権がついた状態にしてしまいます。
> すると管理者権限を持った自分でもアクセス出来ない場所が出来上がる寸法です。

  それが発生するのは、根本的な設定ミスだと思いますが・・・

  Win7 で管理しているとのこと。Pro?Ultimate?
  Homeならそこまで細かい設定できないはずです。

以上。
先に権限をつけてあげると、うまく動くみたいです。

Imports System.IO
Imports System.Security
Imports System.Security.AccessControl
Imports System.Security.Principal

Module Module1

    Sub Main()

        Dim targetDirectoryName As String = "R:\ACC"
        Dim buitinAdminName As String = "BUILTIN\Administrators"

        Dim dirInfo As New DirectoryInfo(targetDirectoryName)
        Dim dirSecurity As DirectorySecurity = dirInfo.GetAccessControl()
        Dim builtinAdmin As New NTAccount(buitinAdminName)
        Dim permissions As New FileSystemAccessRule(builtinAdmin, FileSystemRights.TakeOwnership Or FileSystemRights.ChangePermissions, AccessControlType.Allow)

        dirSecurity.AddAccessRule(permissions)
        dirInfo.SetAccessControl(dirSecurity)

        dirSecurity.SetOwner(builtinAdmin)
        dirInfo.SetAccessControl(dirSecurity)
    End Sub

End Module

いきなり所有者を変更する場合は、SE_TAKE_OWNERSHIP_NAME 特権を取得してください。

使用する API は
GetCurrentProcess/OpenProcessToken/LookupPrivilegeValue/AdjustTokenPrivileges/CloseHandle

DOBON.NET | プログラミング道 | プログラミング掲示板