feat: add Share Permission & AD Group sync UI framework and customizable service template

This commit is contained in:
2026-10-20 20:05:33 +09:00
parent ccc1b47dfd
commit a44c4a42cb
7 changed files with 604 additions and 3 deletions
+142
View File
@@ -23,6 +23,7 @@ Add-Type -AssemblyName System.DirectoryServices
. (Join-Path $ScriptDir "Modules\ADService.ps1")
. (Join-Path $ScriptDir "Modules\NetAppService.ps1")
. (Join-Path $ScriptDir "Modules\SqlService.ps1")
. (Join-Path $ScriptDir "Modules\ShareSyncService.ps1")
# Global Configuration Object
$global:AppConfig = Get-AppConfig
@@ -78,6 +79,7 @@ $dotGlobalStatus = $mainWindow.FindName("DotGlobalStatus")
$navDashboard = $mainWindow.FindName("NavDashboard")
$navAD = $mainWindow.FindName("NavAD")
$navNetApp = $mainWindow.FindName("NavNetApp")
$navShareAccess = $mainWindow.FindName("NavShareAccess")
$navSql = $mainWindow.FindName("NavSql")
$navSettings = $mainWindow.FindName("NavSettings")
$btnGlobalRefresh = $mainWindow.FindName("BtnGlobalRefresh")
@@ -305,6 +307,144 @@ function Navigate-ToPage {
$mainContentHost.Content = $ViewCache["NetApp"]
}
"ShareAccess" {
$txtHeaderTitle.Text = "공유 권한 및 AD 보안그룹 연계 관리"
$txtHeaderSubtitle.Text = "DB 조회 기반의 사용자 권한 할당/해제 및 Share 동명 AD 보안그룹 1:1 동기화"
if (-not $ViewCache.ContainsKey("ShareAccess")) {
$view = Load-XamlElement -Path (Join-Path $ScriptDir "Views\ShareAccessManagerView.xaml")
$cmbShare = $view.FindName("CmbShareList")
$btnReloadDb = $view.FindName("BtnReloadFromDb")
$btnReloadAd = $view.FindName("BtnReloadADGroup")
$txtTargetGroup = $view.FindName("TxtTargetADGroupName")
$dbGrid = $view.FindName("DbUsersGrid")
$btnSelectAll = $view.FindName("BtnSelectAll")
$btnDeselectAll = $view.FindName("BtnDeselectAll")
$txtDbCount = $view.FindName("TxtDbCount")
$btnAdd = $view.FindName("BtnAddToShareGroup")
$btnRemove = $view.FindName("BtnRemoveFromShareGroup")
$adGrid = $view.FindName("ADGroupMembersGrid")
$txtAdCount = $view.FindName("TxtAdGroupCount")
$txtLogs = $view.FindName("TxtSyncLogs")
$btnClearLog = $view.FindName("BtnClearLog")
# Helper to append logs
$appendLog = {
param([string]$msg)
$time = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
$txtLogs.Text = "[$time] $msg`r`n" + $txtLogs.Text
}
# Load Share List into ComboBox
$shares = Get-DbShareList -Config $global:AppConfig
$cmbShare.Items.Clear()
foreach ($s in $shares) {
$item = New-Object System.Windows.Controls.ComboBoxItem
$item.Content = "$($s.ShareName) ($($s.Description))"
$item.Tag = $s.ShareName
$cmbShare.Items.Add($item) | Out-Null
}
if ($cmbShare.Items.Count -gt 0) { $cmbShare.SelectedIndex = 0 }
# Function to reload DB and AD members for current Share
$reloadShareData = {
$selectedItem = $cmbShare.SelectedItem
$shareName = if ($selectedItem -and $selectedItem.Tag) { $selectedItem.Tag } else { "Finance_Share" }
if ($txtTargetGroup) { $txtTargetGroup.Text = $shareName }
# 1. DB Users
$dbUsers = Get-DbUsersForShare -ShareName $shareName -Config $global:AppConfig
$dbGrid.ItemsSource = $dbUsers
if ($txtDbCount) { $txtDbCount.Text = "총 $($dbUsers.Count)명 조회됨" }
# 2. AD Group Members
$adMembers = Get-ADGroupMembersByShareName -GroupName $shareName -Config $global:AppConfig
$adGrid.ItemsSource = $adMembers
if ($txtAdCount) { $txtAdCount.Text = "현재 그룹 멤버: $($adMembers.Count)명" }
}
$cmbShare.add_SelectionChanged({ &$reloadShareData })
if ($btnReloadDb) { $btnReloadDb.add_Click({ &$reloadShareData }) }
if ($btnReloadAd) { $btnReloadAd.add_Click({ &$reloadShareData }) }
# Select / Deselect All
if ($btnSelectAll) {
$btnSelectAll.add_Click({
if ($dbGrid.ItemsSource) {
foreach ($u in $dbGrid.ItemsSource) { $u.IsSelected = $true }
$dbGrid.Items.Refresh()
}
})
}
if ($btnDeselectAll) {
$btnDeselectAll.add_Click({
if ($dbGrid.ItemsSource) {
foreach ($u in $dbGrid.ItemsSource) { $u.IsSelected = $false }
$dbGrid.Items.Refresh()
}
})
}
# Action: Add Users to Share Group
if ($btnAdd) {
$btnAdd.add_Click({
$selectedItem = $cmbShare.SelectedItem
$shareName = if ($selectedItem -and $selectedItem.Tag) { $selectedItem.Tag } else { "Finance_Share" }
$checkedUsers = @($dbGrid.ItemsSource | Where-Object { $_.IsSelected })
if ($checkedUsers.Count -eq 0) {
[System.Windows.MessageBox]::Show("목록에서 추가할 사용자를 체크박스로 1명 이상 선택하십시오.", "선택 필요", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
$sams = @($checkedUsers | ForEach-Object { $_.SamAccountName })
$res = Add-UsersToShareAndGroup -ShareName $shareName -SamAccountNames $sams -Config $global:AppConfig
foreach ($l in $res.Logs) { &$appendLog $l }
[System.Windows.MessageBox]::Show($res.Message, "그룹 추가 완료", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Information)
&$reloadShareData
})
}
# Action: Remove Users from Share Group
if ($btnRemove) {
$btnRemove.add_Click({
$selectedItem = $cmbShare.SelectedItem
$shareName = if ($selectedItem -and $selectedItem.Tag) { $selectedItem.Tag } else { "Finance_Share" }
$checkedUsers = @($dbGrid.ItemsSource | Where-Object { $_.IsSelected })
if ($checkedUsers.Count -eq 0) {
[System.Windows.MessageBox]::Show("목록에서 해제/제거할 사용자를 체크박스로 1명 이상 선택하십시오.", "선택 필요", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
$sams = @($checkedUsers | ForEach-Object { $_.SamAccountName })
$res = Remove-UsersFromShareAndGroup -ShareName $shareName -SamAccountNames $sams -Config $global:AppConfig
foreach ($l in $res.Logs) { &$appendLog $l }
[System.Windows.MessageBox]::Show($res.Message, "그룹 해제 완료", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Information)
&$reloadShareData
})
}
if ($btnClearLog) {
$btnClearLog.add_Click({ $txtLogs.Text = "" })
}
&$reloadShareData
$ViewCache["ShareAccess"] = $view
}
$mainContentHost.Content = $ViewCache["ShareAccess"]
}
"Sql" {
$txtHeaderTitle.Text = "MS SQL 데이터베이스 관리"
$txtHeaderSubtitle.Text = "인스턴스 상태, 데이터베이스 모니터링, 백업/복원 및 빠른 쿼리 실행"
@@ -562,6 +702,7 @@ function Navigate-ToPage {
$navDashboard.add_Checked({ Navigate-ToPage -PageName "Dashboard" })
$navAD.add_Checked({ Navigate-ToPage -PageName "AD" })
$navNetApp.add_Checked({ Navigate-ToPage -PageName "NetApp" })
$navShareAccess.add_Checked({ Navigate-ToPage -PageName "ShareAccess" })
$navSql.add_Checked({ Navigate-ToPage -PageName "Sql" })
$navSettings.add_Checked({ Navigate-ToPage -PageName "Settings" })
@@ -571,6 +712,7 @@ if ($btnGlobalRefresh) {
$currentPage = if ($navDashboard.IsChecked) { "Dashboard" }
elseif ($navAD.IsChecked) { "AD" }
elseif ($navNetApp.IsChecked) { "NetApp" }
elseif ($navShareAccess.IsChecked) { "ShareAccess" }
elseif ($navSql.IsChecked) { "Sql" }
elseif ($navSettings.IsChecked) { "Settings" }
else { "Dashboard" }