/// <summary>
        /// ファイルアクセス権の移管
        /// </summary>
        /// <param name="src_file">移管元ファイル名</param>
        /// <param name="dst_file">移管先ファイル</param>
        /// <param name="comparison_list">変換対象一覧</param>
        /// <returns></returns>
        private static bool file_authority_replacement(FileInfo src_file, FileInfo dst_file, ref Dictionary <string, comparsion_unit> comparison_list)
        {
            try
            {
                FileSecurity src_file_security = src_file.GetAccessControl();   // 移管元のアクセス権取得
                FileSecurity dst_file_security = dst_file.GetAccessControl();   // 移管先のアクセス権取得
                foreach (FileSystemAccessRule src_rules in src_file_security.GetAccessRules(true, true, typeof(NTAccount)))
                {
                    int    cat_pint     = src_rules.IdentityReference.ToString().LastIndexOf('\\') + 1;
                    string account_name = src_rules.IdentityReference.ToString().Substring(cat_pint);
                    loger_manager.write_log($"{account_name}");
                    if (comparison_list.ContainsKey(account_name))
                    {
                        loger_manager.write_log($"適応先:\t{dst_file.FullName}\t" + ((src_rules.InheritanceFlags & InheritanceFlags.ContainerInherit) > 0 ? "このフォルダとサブフォルダ" : "このフォルダのみ"), "conversion");

                        comparsion_unit unit = comparison_list[account_name];
                        if (unit.del_flg == 1)
                        {
                            loger_manager.write_log($"削除対象アカウント:\t{unit.account_name}\t{unit.conversion_original} | {src_rules.FileSystemRights.ToString()}", "conversion");
                            continue; // del_flgが1のものは権限設定処理を行わない
                        }

                        loger_manager.write_log($"変換対象アカウント:\t{unit.account_name} {unit.conversion_original} → {unit.after_conversion} | {src_rules.FileSystemRights.ToString()}", "conversion");
                        dst_file_security.AddAccessRule(new FileSystemAccessRule(unit.after_conversion,
                                                                                 src_rules.FileSystemRights,
                                                                                 src_rules.InheritanceFlags,
                                                                                 src_rules.PropagationFlags,
                                                                                 src_rules.AccessControlType));
                    }
                    else
                    {
                        loger_manager.write_log($"適応先:\t{dst_file.FullName}\t" + ((src_rules.InheritanceFlags & InheritanceFlags.ContainerInherit) > 0 ? "このフォルダとサブフォルダ" : "このフォルダのみ"), "extracting", "extracting");
                        loger_manager.write_log($"変換対象外アカウント:\t{account_name} | {src_rules.FileSystemRights.ToString()}", "extracting", "extracting");
                        dst_file_security.AddAccessRule(src_rules); // 変換対象が無ければ、移管元の権限そのまま移管
                    }
                }
                if (dst_file_security.GetAccessRules(true, true, typeof(NTAccount)).Count > 0)
                {
                    dst_file.SetAccessControl(dst_file_security);
                }
                else
                {
                    throw new Exception($"アクセス権の設定が無い :\t{src_file.FullName}");
                }

                return(true);
            }
            catch (Exception e)
            {
                loger_manager.write_log($"適応先:\t{dst_file.FullName}\t{e.Message}", "error");
                return(false);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// シリアライズ元データ作成関数
        /// </summary>
        /// <returns></returns>
        private static comparison_table create_comparison_data(DataTable group_list)
        {
            Func <string, string, string> transform_str_to_cug = (string src_str, string account_name_filter) =>
            {
                string trim_str = src_str.Trim(); // 前後の空白を排除
                if (trim_str.Equals(""))
                {
                    return("");
                }

                int all_appear_position = account_name_filter.LastIndexOf('*'); // フィルターでしてした*の出現位置取得
                if (all_appear_position == -1)
                {
                    return("");
                }

                string group_header = account_name_filter.Substring(0, all_appear_position);
                return(group_header + trim_str);
            };

            comparison_table compari_table = new comparison_table();

            active_direcory_module          ad_obj      = get_ad_object();                       // 移動う元ADからグループ情報を取得
            mysql_module                    mysql       = create_mysql_module();
            Dictionary <string, group_info> group_infos = get_group_infos_from_destination_ad(); // 移動先ADから取得したグループ情報の取得
            string ad_account_name_filter = json_module.get_external_resource("dst_account_name_filter");
            string destination_domain     = json_module.get_external_resource("destination_domain");

            if (!destination_domain.Equals(""))
            {
                destination_domain += "\\";
            }

            if ((group_infos == null) || (group_infos.Count == 0))
            {
                loger_manager.write_log("ADからの取得グループ情報がありません", "warning");
                return(null);
            }

            foreach (KeyValuePair <string, group_info> ad_group_membars in ad_obj.groups_list) // 移動元ADから取得したグループ情報を元にループ
            {
                // グループ情報の追加
                string    query_str   = $"Name = '{ad_group_membars.Key}'";
                DataRow[] result_rows = group_list.Select(query_str);
                if (result_rows.Length > 0)
                {
                    foreach (var result_row in result_rows)
                    {
                        try
                        {
                            string          group_name = transform_str_to_cug(result_row["CUGコード"].ToString(), ad_account_name_filter);
                            comparsion_unit unit       = new comparsion_unit();
                            unit.account_name        = ad_group_membars.Value.account_name;
                            unit.conversion_original = ad_group_membars.Value.sid;

                            if (!group_infos.ContainsKey(group_name)) // CUGコードがリソースに設定されてなければ、移行対象外とする
                            {
                                unit.after_conversion = "";
                                unit.del_flg          = 1;
                            }
                            else
                            {
                                unit.after_conversion = destination_domain + group_name;
                            }

                            if (!compari_table.comparsion_units.Contains(unit))
                            {
                                compari_table.comparsion_units.Add(unit);
                            }
                        }
                        catch (Exception e)
                        {
                            loger_manager.write_log(e.Message, "error");
                        }
                    }
                }
                else
                {
                    loger_manager.write_log($"該当するグループ名がありません グループ名: {ad_group_membars.Key}", "extracting", "extracting");
                }

                if (ad_group_membars.Value.group_members.Count == 0)
                {
                    continue;
                }

                // ユーザー毎に追加処理
                foreach (user_info membar_user in ad_group_membars.Value.group_members)
                {
                    try
                    {
                        var users = user_info.get_user_infos(mysql.connection_sql_str(), membar_user.account_name);
                        if ((users == null) || (users.Count == 0))
                        {
                            continue;
                        }

                        comparsion_unit unit = new comparsion_unit(membar_user, users[0], membar_user.sid, destination_domain + users[0].account_name);
                        if (!compari_table.comparsion_units.Contains(unit))
                        {
                            compari_table.comparsion_units.Add(unit);
                        }
                    }
                    catch (Exception e)
                    {
                        loger_manager.write_log(e.Message, "error");
                    }
                }
            }

            compari_table.list_sort(); // 全て格納後、ソートを行う
            return(compari_table);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// ファイルアクセス権の比較
        /// </summary>
        /// <param name="src_file">移管元ファイル名</param>
        /// <param name="dst_file">移管先ファイル</param>
        /// <param name="comparison_list">変換対象一覧</param>
        /// <returns></returns>
        private static bool file_permission_comparative(FileInfo src_file, FileInfo dst_file, ref Dictionary <string, comparsion_unit> comparison_list)
        {
            try
            {
                FileSecurity src_file_security = src_file.GetAccessControl();   // 移管元のアクセス権取得
                FileSecurity dst_file_security = dst_file.GetAccessControl();   // 移管先のアクセス権取得
                Func <FileSystemAccessRule, bool> check_permission_of_dstfile = (FileSystemAccessRule comparative_auth) =>
                {
                    foreach (FileSystemAccessRule rule in dst_file_security.GetAccessRules(true, true, typeof(NTAccount)))
                    {
                        // 下記の何れかが異なれば trueを返さない
                        if (!comparative_auth.IdentityReference.Equals(rule.IdentityReference))
                        {
                            continue;
                        }
                        if (!comparative_auth.FileSystemRights.Equals(rule.FileSystemRights))
                        {
                            continue;
                        }
                        if (!comparative_auth.InheritanceFlags.Equals(rule.InheritanceFlags))
                        {
                            continue;
                        }
                        if (!comparative_auth.PropagationFlags.Equals(rule.PropagationFlags))
                        {
                            continue;
                        }
                        if (!comparative_auth.AccessControlType.Equals(rule.AccessControlType))
                        {
                            continue;
                        }

                        return(true);
                    }

                    return(false);
                };

                if (src_file_security.GetAccessRules(true, true, typeof(NTAccount)).Count <= 0)
                {
                    throw new Exception($"アクセス権の設定が無い src: {src_file.FullName}");
                }

                if (dst_file_security.GetAccessRules(true, true, typeof(NTAccount)).Count <= 0)
                {
                    throw new Exception($"アクセス権の設定が無い dst: {dst_file.FullName}");
                }

                foreach (FileSystemAccessRule src_rule in src_file_security.GetAccessRules(true, true, typeof(NTAccount)))
                {
                    int    cat_pint     = src_rule.IdentityReference.ToString().LastIndexOf('\\') + 1;
                    string account_name = src_rule.IdentityReference.ToString().Substring(cat_pint);

                    FileSystemAccessRule comparative_authority = src_rule;

                    if (comparison_list.ContainsKey(account_name))
                    {
                        loger_manager.write_log($"適応先: {dst_file.FullName} " + ((src_rule.InheritanceFlags & InheritanceFlags.ContainerInherit) > 0 ? "このフォルダとサブフォルダ" : "このフォルダのみ"), "conversion");

                        comparsion_unit unit = comparison_list[account_name];
                        if (unit.del_flg == 1)
                        {
                            loger_manager.write_log($"削除対象アカウント: {unit.account_name} {unit.conversion_original} | {src_rule.FileSystemRights.ToString()}", "del account");
                            continue; // del_flgが1のものは権限設定処理を行わない
                        }

                        // アカウント名が変更後として比較対象変数に格納
                        comparative_authority = new FileSystemAccessRule(unit.after_conversion, src_rule.FileSystemRights, src_rule.InheritanceFlags, src_rule.PropagationFlags, src_rule.AccessControlType);
                    }

                    if (!check_permission_of_dstfile(comparative_authority)) // コピー先に権限があるか判定
                    {
                        loger_manager.write_log($"コピー元ファイル名: {src_file.FullName}\tコピー先ファイル名: {dst_file.FullName}\tアカウント名: {comparative_authority.IdentityReference}", "diff", "extracting");
                    }
                }

                return(true);
            }
            catch (Exception e)
            {
                loger_manager.write_log(e.Message, "error");
                return(false);
            }
        }
        /// <summary>
        /// ディレクトリアクセス権の移管
        /// </summary>
        /// <param name="src_dir">移管元ディレクトリ</param>
        /// <param name="dst_dir">移管先ディレクトリ</param>
        /// <param name="comparison_list">変換対象一覧</param>
        /// <returns></returns>
        private static bool directory_authority_replacement(DirectoryInfo src_dir, DirectoryInfo dst_dir, ref Dictionary <string, comparsion_unit> comparison_list)
        {
            try
            {
                DirectorySecurity     src_dir_security = src_dir.GetAccessControl(); // 移管元のアクセス権取得
                DirectorySecurity     dst_dir_security = dst_dir.GetAccessControl(); // 移管先のアクセス権取得
                Func <string, string> get_account_name = (string identity_reference) =>
                {
                    int cat_pint = identity_reference.LastIndexOf('\\') + 1;
                    return(identity_reference.Substring(cat_pint));
                };

                if ((dst_dir_security.AreAccessRulesProtected == false) && (src_dir_security.AreAccessRulesProtected == true)) // コピー元が継承を切っており、コピー先が継承権を持っている場合のみ
                {
                    dst_dir_security = authority_triming(src_dir, dst_dir);
                    if (dst_dir_security == null)
                    {
                        throw new Exception("継承権設定でエラーが発生");
                    }
                }

                foreach (FileSystemAccessRule src_rules in src_dir_security.GetAccessRules(true, true, typeof(NTAccount)))
                {
                    string account_name = get_account_name(src_rules.IdentityReference.ToString());
                    if (comparison_list.ContainsKey(account_name))
                    {
                        loger_manager.write_log($"適応先:\t{dst_dir.FullName} " + ((src_rules.InheritanceFlags & InheritanceFlags.ContainerInherit) > 0 ? "このフォルダとサブフォルダ" : "このフォルダのみ"), "conversion");
                        comparsion_unit unit = comparison_list[account_name];
                        if (unit.del_flg == 1)
                        {
                            loger_manager.write_log($"削除対象アカウント:\t{unit.account_name} {unit.conversion_original} | {src_rules.FileSystemRights.ToString()}", "conversion");
                            continue; // del_flgが1のものは権限設定処理を行わない
                        }

                        loger_manager.write_log($"変換対象アカウント:\t{unit.account_name} {unit.conversion_original} → {unit.after_conversion} | {src_rules.FileSystemRights.ToString()}", "conversion");
                        dst_dir_security.AddAccessRule(new FileSystemAccessRule(unit.after_conversion, src_rules.FileSystemRights,
                                                                                src_rules.InheritanceFlags, src_rules.PropagationFlags,
                                                                                src_rules.AccessControlType));
                    }
                    else
                    {
                        loger_manager.write_log($"適応先:\t{dst_dir.FullName} " + ((src_rules.InheritanceFlags & InheritanceFlags.ContainerInherit) > 0 ? "このフォルダとサブフォルダ" : "このフォルダのみ"), "extracting", "extracting");
                        loger_manager.write_log($"変換対象外アカウント:\t{account_name} | {src_rules.FileSystemRights.ToString()}", "extracting", "extracting");
                        dst_dir_security.AddAccessRule(src_rules);
                    }
                }
                if (dst_dir_security.GetAccessRules(true, true, typeof(NTAccount)).Count > 0)
                {
                    dst_dir.SetAccessControl(dst_dir_security); // アクセス権の設定
                }
                else
                {
                    throw new Exception($"アクセス権の設定が無い :\t{src_dir.FullName}");
                }

                return(true);
            }
            catch (Exception e)
            {
                loger_manager.write_log($"適応先:\t{dst_dir.FullName}\t{e.GetType()} {e.Message}", "error", "info");
                return(false);
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// ディレクトリアクセス権の比較
        /// </summary>
        /// <param name="src_dir">移管元ディレクトリ</param>
        /// <param name="dst_dir">移管先ディレクトリ</param>
        /// <param name="comparison_list">変換対象一覧</param>
        /// <returns></returns>
        private static bool directory_authority_comparative(DirectoryInfo src_dir, DirectoryInfo dst_dir, ref Dictionary <string, comparsion_unit> comparison_list)
        {
            try
            {
                DirectorySecurity src_dir_security = src_dir.GetAccessControl();    // 移管元のアクセス権取得
                DirectorySecurity dst_dir_security = dst_dir.GetAccessControl();    // 移管先のアクセス権取得
                Func <FileSystemAccessRule, bool> check_permission_of_dstdir = (FileSystemAccessRule comparative_auth) =>
                {
                    foreach (FileSystemAccessRule rule in dst_dir_security.GetAccessRules(true, true, typeof(NTAccount)))
                    {
                        if (!comparative_auth.IdentityReference.Equals(rule.IdentityReference))
                        {
                            continue;
                        }
                        if (!comparative_auth.FileSystemRights.Equals(rule.FileSystemRights))
                        {
                            continue;
                        }
                        if (!comparative_auth.InheritanceFlags.Equals(rule.InheritanceFlags))
                        {
                            continue;
                        }
                        if (!comparative_auth.PropagationFlags.Equals(rule.PropagationFlags))
                        {
                            continue;
                        }
                        if (!comparative_auth.AccessControlType.Equals(rule.AccessControlType))
                        {
                            continue;
                        }

                        return(true);
                    }

                    return(false);
                };

                if (src_dir_security.GetAccessRules(true, true, typeof(NTAccount)).Count <= 0)
                {
                    throw new Exception($"アクセス権の設定が無い src: {src_dir.FullName}");
                }

                if (dst_dir_security.GetAccessRules(true, true, typeof(NTAccount)).Count <= 0)
                {
                    throw new Exception($"アクセス権の設定が無い dst: {dst_dir.FullName}");
                }

                foreach (FileSystemAccessRule src_rule in src_dir_security.GetAccessRules(true, true, typeof(NTAccount)))
                {
                    int    cat_pint     = src_rule.IdentityReference.ToString().LastIndexOf('\\') + 1;
                    string account_name = src_rule.IdentityReference.ToString().Substring(cat_pint);

                    FileSystemAccessRule comparative_authority = src_rule;

                    if (comparison_list.ContainsKey(account_name)) // 変換対象か判定
                    {
                        comparsion_unit unit = comparison_list[account_name];
                        if (unit.del_flg == 1)
                        {
                            loger_manager.write_log($"削除対象アカウント: {unit.account_name} {unit.conversion_original} | {src_rule.FileSystemRights.ToString()}");
                            continue;
                        }

                        // アカウント名が変更後として比較対象変数に格納
                        comparative_authority = new FileSystemAccessRule(unit.after_conversion, src_rule.FileSystemRights, src_rule.InheritanceFlags, src_rule.PropagationFlags, src_rule.AccessControlType);
                    }

                    if (!check_permission_of_dstdir(comparative_authority)) // コピー先に権限があるか判定
                    {
                        loger_manager.write_log($"コピー元フォルダ名: {src_dir.FullName}\tコピー先フォルダ名: {dst_dir.FullName}\tアカウント名: {comparative_authority.IdentityReference}", "diff", "extracting");
                    }
                }

                return(true);
            }
            catch (Exception e)
            {
                loger_manager.write_log($"{e.GetType()} {e.Message}", "error");
                return(false);
            }
        }