feat: add Share Permission & AD Group sync UI framework and customizable service template
This commit is contained in:
+142
@@ -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" }
|
||||
|
||||
Reference in New Issue
Block a user