Exchange 개발 관련 파워쉘 명령어 모음
/// <summary> /// 메일박스에서 사용자 정보 가져오기 /// </summary> /// <param name="dbhId">DB의 UniqueId</param> /// <returns></returns> private IList<string> GetUserIdFromMailBox(string dbhId) { IList<string> list = new List<string>(); using (var ems = new ExchangePowerShellWrapper(new AppConfigExchangePowerShellConfig())) { var results = ems.PipelineScriptInvoke("Get-MailboxDatabase \"" + dbhId + "\" | Get-Mailbox"); foreach (PSObject item in results) { list.Add(item.Members["WindowsEmailAddress"].Value.ToString()); } } return list; }
[코드1] 특정 EDB안에 있는 사용자 추출 코드
//// MBX Worker process가 시작할 때 이벤트 처리 ManagementEventWatcher startWatcherProcess; startWatcherProcess = new ManagementEventWatcher(new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace WHERE ProcessName = '" + monitoringProcessName + "'")); // WHERE ProcessName = 'microsoft.exchange.store.worker.exe' startWatcherProcess.EventArrived += startWatcher_EventArrived; startWatcherProcess.Start(); //// MBX Worker process가 종료될 때 이벤트 처리 ManagementEventWatcher stopWatcherProcess; stopWatcherProcess = new ManagementEventWatcher(new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace WHERE ProcessName = '" + monitoringProcessName + "'")); // WHERE ProcessName = 'microsoft.exchange.store.worker.exe' stopWatcherProcess.EventArrived += stopWatcher_EventArrived; stopWatcherProcess.Start();
[코드2] ManagementEventWatcher로 프로세스의 시작과 종료 이벤트를 처리
/// <summary> /// 현재 서버의 데이터 베이스를 가져온다. /// </summary> /// <returns></returns> private List<string> GetMailboxActiveDatabaseNames() { var list = new List<string>(); using (var ems = new ExchangePowerShellWrapper(new AppConfigExchangePowerShellConfig())) { var psScript = "Get-MailboxDatabaseCopyStatus -Active -Local | select-object DatabaseName"; var results = ems.PipelineScriptInvoke(psScript); foreach (PSObject item in results) { list.Add(item.Members["DatabaseName"].Value.ToString()); } } return list; }
[코드3] 현재 서버의 Active EDB를 가져온다.
/// <summary> /// 동적으로 사용자 추가 /// </summary> /// <param name="emaillist"></param> /// <returns></returns> private Dictionary<string, string> DynamicUserListAdd(Dictionary<string, string> requestList) { dynamicAddedDate = previousDynamicAddedDate; previousDynamicAddedDate = DateTime.Now.AddSeconds(-1); // 현재 시간을 포함하기 위해 1초를 뺀다. // 파워쉘 명렁으로 알아 내기 using (var powershellInvoker = new ExchangePowerShellWrapper(new AppConfigExchangePowerShellConfig())) { foreach (var databaseName in GetMailboxActiveDatabaseNames()) { // 파워쉘 실행 //var psScript = "Get-Mailbox -Database \"" + databaseName + "\" -Filter {(WhenChanged -gt \"" + dynamicAddedDate.ToString("yyyy-MM-dd HH:mm:ss") + "\")} -ResultSize unlimited | select-object WindowsEmailAddress"; // 파워쉘의 WhenChanged 필터를 통해 수정된 일자를 바탕으로 이메일 사용자 계정을 검색한다. log.Info(string.Format("{0} database에서 사용자를 추출하는 중입니다...", databaseName)); Collection<Command> listCommand = new Collection<Command>(); var command = new Command("Get-Mailbox"); command.Parameters.Add("Database", databaseName); command.Parameters.Add("Filter", "WhenChanged -gt \"" + dynamicAddedDate.ToString("yyyy-MM-dd HH:mm:ss") + "\""); //command.Parameters.Add("Filter", "WhenChanged -gt \"2013-06-10 17:00:00\""); command.Parameters.Add("ResultSize", "unlimited"); listCommand.Add(command); var props = new string[] { "WindowsEmailAddress" }; Command CommandSelect = new Command("Select-Object"); CommandSelect.Parameters.Add("Property", props); listCommand.Add(CommandSelect); var results = powershellInvoker.PipelineInvoke(listCommand); log.Info(string.Format("{0} database에서 사용자 계정 {1}개 추출 하였습니다.", databaseName, results.Count)); foreach (var user in results) { // 사용자의 이메일 주소 var windowsEmailAddress = user.Members["WindowsEmailAddress"].Value.ToString(); // 새로운 사용자만 추가 if (!requestList.ContainsKey(windowsEmailAddress)) { requestList.Add(windowsEmailAddress, databaseName); } } } } return requestList; }
[코드4] 최근에 변경된 사용자만 알아내어 기존 리스트에 추가하는 코드
/// <summary> /// 데이터베이스 명으로 사용자 리스트 가져오기 /// </summary> /// <param name="databaseName"></param> /// <returns></returns> public Dictionary<string, string> GetMailboxbyDatabaseNames(string databaseName) { // 요청자 사용자 리스트 var requestList = new Dictionary<string, string>(); // 파워쉘 명렁으로 알아 내기 using (var powershellInvoker = new ExchangePowerShellWrapper(new AppConfigExchangePowerShellConfig())) { int mailUserCount = 0; var psScript = "Get-Mailbox -Database \"" + databaseName + "\" -ResultSize unlimited | select-object WindowsEmailAddress"; foreach (var user in powershellInvoker.PipelineScriptInvoke(psScript)) { // 사용자의 이메일 주소 var windowsEmailAddress = user.Members["WindowsEmailAddress"].Value.ToString(); var databaseNameTemp = databaseName; requestList.Add(windowsEmailAddress, databaseName); mailUserCount++; } log.Info(string.Format("{0} database에서 {1}개의 사용자 계정이 추가 되었습니다.", databaseName, mailUserCount)); } return requestList; }
[코드5] 데이터베이스 명으로 사용자 리스트 가져오기