[C#] 파일에 대한 전체 액세스 권한

14431 단어 C#tech
제비를 뽑다
https://qiita.com/tera1707/items/4fda73d86eded283ec4f

하고 싶은 일


윈도 PC에서 제작하고 싶은 관리자 사용자, 관리자의 사용자가 모두 접근할 수 있는 파일이 아닙니다.

방법

FileSecurity사용류,FileSystemAccessRule류.
  • File.GetAccessControl() 지정된 파일 이름FileSecurity을 통해
  • 지정할 액세스 권한 지정(Access Rights)FileSystemAccessRule 클래스 제작
  • FileSecurityAddAccessRule()에서 만든 FileSystemAccess Rule
  • 전송
  • FileSecurity를 File.SetAccessControl()
  • 에 전달
    이렇게 하면 지정한 파일에 대한 접근 권한을 설정할 수 있습니다.
    코드는 다음과 같습니다.
    간은 AddFileSecurity() 방법입니다.
    using System;
    using System.IO;
    using System.Security.AccessControl;
    using System.Windows;
    
    namespace FileAccessRightsTest
    {
        class Program
        {
            static string TargetStringFilePath = @"C:\ProgramData\MyDebug\TargetString.txt";
    
            static void Main(string[] args)
            {
                WriteStringToFile(TargetStringFilePath, "AAAAAAA......");
            }
    
            /// <summary>
            /// アクセス権限セットのありなしを選ばせた後、
            /// 指定のファイルを作成し(開き)、
            /// 全ユーザーにフルアクセス権限を許可する。
            /// ファイルを開けなかったら開けないときの例外のMessageをMessageBoxで表示する
            /// </summary>
            public static void WriteStringToFile(string path, string data)
            {
                Console.WriteLine("0:アクセス権限セットなし  1:セットあり");
                var acSet = Console.ReadLine();
    
                try
                {
                    var dir = Path.GetDirectoryName(path);
                    if (!Directory.Exists(dir))
                    {
                        Directory.CreateDirectory(dir);
                    }
    
                    using (var fs = new FileStream(path, FileMode.Create))
                    using (var sw = new StreamWriter(fs))
                    {
                        sw.Write(data);
                        MessageBox.Show("ファイル作成完了");
                    }
    
                    if (acSet != "0")
                    {
                        AddFileSecurity(path, @"BUILTIN\Users", FileSystemRights.FullControl, AccessControlType.Allow);
                        MessageBox.Show("セキュリティセット完了");
                    }
                    else
                    {
                        MessageBox.Show("セキュリティセットなし");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            // https://docs.microsoft.com/ja-jp/dotnet/api/system.security.accesscontrol.filesecurity?view=windowsdesktop-5.0
    	// のサンプルそのまま。
            public static void AddFileSecurity(string fileName, string account, FileSystemRights rights, AccessControlType controlType)
            {
                // Get a FileSecurity object that represents the
                // current security settings.
                FileSecurity fSecurity = File.GetAccessControl(fileName);
    
                // Add the FileSystemAccessRule to the security settings.
                fSecurity.AddAccessRule(new FileSystemAccessRule(account, rights, controlType));
    
                // Set the new access settings.
                File.SetAccessControl(fileName, fSecurity);
            }
        }
    }
    

    메모지


    샘플 코드는 @"C:\ProgramData\MyDebug\TargetString.txt"에서 파일을 만듭니다.
    상기 코드를 사용하여 전면적인 접근을 하는 방법은 구체적으로
  • 관리자 A를 통해 로그인
  • 위 코드를 사용하여 TargetString을 수행합니다.txt를 작성하여 "BUILTIN\Users"전체 액세스 권한 부여
  • 비관리자 사용자 B로 로그인
  • 위 코드를 사용하여 TargetString을 수행합니다.txt 쓰기
  • 이러한 절차에 따라 사용자 B도 파일에 쓸 수 있다.
    그렇지 않으면 전체 액세스 권한이 부여되지 않습니다. 예를 들어
  • 관리자 A를 통해 로그인
  • 위 코드를 사용하여 TargetString을 수행합니다.txt 작성, "BUILTIN\Users"권한 없음
  • 비관리자 사용자 B로 로그인
  • 위 코드를 사용하여 TargetString을 수행합니다.txt 쓰기
  • → 사용자 B가 파일을 쓸 수 없습니다.catch에 MsgBox "접근 거부"를 표시합니다.
    되다

    향후 ToDo


    아시겠지만 일단 권한만 부여되면 방문할 수 있습니다.

    MS 공식의 DACL SACL은 잘 모릅니다.
    공부가 필요해...

    참고 자료


    FileSecurity 수준에 대한 공식 설명
    https://docs.microsoft.com/ja-jp/dotnet/api/system.security.accesscontrol.filesecurity?view=windowsdesktop-5.0
    @ "BUILTIN\Users"는 모든 사용자가 액세스할 수 있음을 나타냅니다.
    https://stackoverflow.com/questions/8944765/c-sharp-set-directory-permissions-for-all-users-in-windows-7 WellKnownSidType.BuiltinUsersSid모든 사용자를 지정할 수 있습니까?(시도되지 않음)
    https://stackoverflow.com/questions/9108399/how-to-grant-full-permission-to-a-file-created-by-my-application-for-all-users?answertab=active#tab-top
    파일의 읽기와 쓰기
    https://qiita.com/tera1707/items/65025aca202ef0535fa5

    좋은 웹페이지 즐겨찾기