iT邦幫忙

0

C# 修改 Active Directory 使用者密碼時的Exception處理

  • 分享至 

  • xImage

各位好
我在更改使用者密碼的時候
希望可以個別捕捉舊密碼錯誤和不符合密碼原則這兩個例外
測試下來的結果
這兩種情況都會進到PasswordException裡面
想問一下除了用contains的方式判斷錯誤訊息外
有沒有更快或更好的方式可以單獨處理這兩個例外呢?

public void SetPassword(string pUsername)
{
    try
    {
        string strOldPassword = "Aa123456";
        string strNewPassword = "Bb123456";
        
        using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "127.0.0.1"))
        {
            UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, pUsername);

            if (user != null)
            {
                user.ChangePassword(strOldPassword, strNewPassword);
                user.Save();
            }
        }
    }
    catch (PasswordException ex)
    {
        if (ex.Message.Contains("密碼錯誤"))
        {
            //do something...
        }
        else if (ex.Message.Contains("密碼原則錯誤"))
        {
            //do something...
        }
        else
        {
            throw ex;
        }
    }
}
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
厚厚
iT邦新手 1 級 ‧ 2024-01-16 09:55:26
最佳解答
看更多先前的回應...收起先前的回應...
厚厚 iT邦新手 1 級 ‧ 2024-01-16 09:59:56 檢舉

但不符合密碼原則,應該還是只能利用 PasswordException 去處理了

皓皓 iT邦新手 3 級 ‧ 2024-01-16 10:04:23 檢舉

我有查到這個方法~
但這個方法是不是就是單純檢查是否可以登入而已?
因為我發現如果那個使用者的密碼已到期的話
好像也是會回傳false

我原本想做的是
使用者先輸入原本帳號密碼
若帳號密碼正確才判斷密碼是否到期
如果到期再讓使用者更改密碼

但由於ValidateCredentials這個方法只要密碼到期
都會回傳false
我就無法實現先檢查原本帳號密碼是否正確這一步

皓皓 iT邦新手 3 級 ‧ 2024-01-16 10:06:37 檢舉

最後我才會想說用UserPrincipal類別的ChangePassword方法
將兩個輸入值都設定為使用者原本的密碼
若出現密碼原則錯誤
則代表原密碼是正確的
若出現密碼錯誤
那就代表使用者輸入的密碼是錯的

厚厚 iT邦新手 1 級 ‧ 2024-01-16 10:25:08 檢舉

試試這個屬性PasswordExpirationDate
DateTime eDate = user.PasswordExpirationDate;

皓皓 iT邦新手 3 級 ‧ 2024-01-16 10:41:54 檢舉

這個屬性可以成功檢查到期日~
但有我個問題
我發現他只需要使用者名稱就可以看到到期日
不需要驗證密碼耶
那如同我前面說的已到期的使用者
有什麼方法可以驗證目前帳號密碼是否正確嗎?

allenlwh iT邦高手 1 級 ‧ 2024-01-16 12:27:56 檢舉

只要是超過到期日,仍有沒有變更密碼的,原密碼不就是失效的嗎?
就算是原密碼是正確的,去做ValidateCredentials,還是會回傳false

皓皓 iT邦新手 3 級 ‧ 2024-01-16 13:11:21 檢舉

是這樣沒錯
但我希望的是使用者可以登入後再去改密碼
因為我目前想不到有什麼方法可以同時驗證使用者登入資訊
又可以讓他改密碼的方法

厚厚 iT邦新手 1 級 ‧ 2024-01-16 15:08:13 檢舉

已到期的帳號判斷為無效很正常
而且先得到資訊(到期日)再判斷處理(更改密碼)也比較省資源不是嗎?
不清楚你流程這樣設計的原因

allenlwh iT邦高手 1 級 ‧ 2024-01-16 15:58:40 檢舉

個人淺見如下,請各位前輩指點。
判斷密碼是否到期
1.已到期-->變更密碼
2.未到期
2.1檢查舊密碼(ValidateCredentials)
2.1.1 true-->變更密碼
2.1.2 false-->重新輸入密碼-->2.1檢查舊密碼

皓皓 iT邦新手 3 級 ‧ 2024-01-17 08:27:38 檢舉

這要歸功於我們公司奇怪的流程設計XD
因為現階段沒有一個地方是可以讓使用者改密碼的
再加上很多系統又是跟AD帳號串接
一旦密碼到期後所有系統就會無法登入
如果寫一支工具讓使用者改密碼
又會出現無法確認改密碼的是不是本人的問題
(怕有人亂改其他人的密碼)
因此才會出現以上奇怪的設計
要在檢查舊密碼成功的情況下
才能讓使用者變更密碼

厚厚 iT邦新手 1 級 ‧ 2024-01-17 08:41:41 檢舉

你們是不是很多同仁都沒進公司?
不然如果過期,遇到的第一個狀況就是無法登入電腦

皓皓 iT邦新手 3 級 ‧ 2024-01-17 08:56:56 檢舉

有一部份是沒進公司
但有一些是作業員沒個人電腦
他們都是用共用電腦登系統的
所以他們只會反饋帳號無法登入的問題給我們

allenlwh iT邦高手 1 級 ‧ 2024-01-17 10:05:11 檢舉

我目前是這樣做:寫一支程式,去檢查密碼到期日小於3天的帳號,寄通知信給user,密碼即將到期,請他們記得改密碼。

厚厚 iT邦新手 1 級 ‧ 2024-01-17 10:13:50 檢舉

理解了
我覺得只能落實共用電腦也要使用自己的AD登入電腦再進系統
如果程式下手,程式方面因為當初設計就不是給這樣流程使用的,不然就是自己override,先建一個自己的驗證DB,確認是本人再給改密碼

厚厚 iT邦新手 1 級 ‧ 2024-01-17 10:17:13 檢舉

寄通知信給user,請他們記得改密碼,這個其實作用不大
因為這情境很多是工廠人員,他們其實不需要天天看電腦,只有被告知要去簽核或其他作業時才會去操作電腦,可能一個月才會使用電腦一次

皓皓 iT邦新手 3 級 ‧ 2024-01-17 10:35:53 檢舉

寄信給使用者這個我有考慮過
但就像 厚厚 說的一樣
作業員不會天天去看電腦,自然也不會有收信的習慣
他們大部分的訊息都自來自於主管的通知

驗證的DB我也有想過
但如果要驗證的話勢必要存使用者密碼
這個又有資安疑慮怕會衍生其他問題XD

用個人AD帳號登入電腦的部分
我覺得要改成這個模式有難度QQ
畢竟很多程式、檔案路徑位置都是固定的
登個人帳號就又要重新安裝或調整
不管是作業員或主管的接受度應該都不高
可能會需要時間去溝通和討論

厚厚 iT邦新手 1 級 ‧ 2024-01-17 10:57:09 檢舉

這就是公司要討論與取捨的了,畢竟有作業員的規模了應該會跑ISO,衍生資安相關問題,登入AD(寫個BAT之類的,新登入就先設置好相關路徑)應該是最省事也最符合的作法

有些公司便宜行事工廠最大,就[表面]有登入,實際上...

allenlwh iT邦高手 1 級 ‧ 2024-01-17 11:37:11 檢舉

針對作業員的部份,不知貴司是否允許作業員能攜帶手機?
如果可以的話,就換個方式,每次要用才配發短時效(8小時)的密碼,或是每N天配發一個密碼給作業員。
一方面可以減輕資安的顧慮,另一方面也不會遇到密碼過期後,要找IT幫忙重設。
我曾看過上海的某企業高管,登入自家的系統前,找手機看簡訊最新配發的密碼。

皓皓 iT邦新手 3 級 ‧ 2024-01-18 09:18:25 檢舉

感謝兩位解答~
我大概有個方向知道怎麼解決了

我要發表回答

立即登入回答