none
限制驗證使用者的可登入工作站後,DirectorySearcher.FindAll()指令出現使用者帳號或密碼錯誤 RRS feed

  • 一般討論

  • 因為安全因素,客戶須限制某些AD管理者帳號只能登入DC本身
    在設定之後,原本在其他伺服器上用c#開發使用DirectoryServices來管理AD使用者的程式就出錯了
    例如執行DirectorySearcher.FindAll()指令會出現使用者帳號或密碼錯誤
    除非也把該伺服器加入此帳號的可登入到電腦清單中
    這意義上似乎有點奇怪
    DirectoryEntry建構子中指定的AD驗證帳號對程式所在電腦是一種登入行為嗎?
    我的LDAP連線是指向AD的IP

    在伺服器srv1運作的程式碼範例如下:
    DirectoryEntry entry = new DirectoryEntry("LDAP://192.168.101.131:389/DC=tailspintoys,DC=com", "Test.User", "password");
    DirectorySearcher mySearcher = new DirectorySearcher(entry);
    SearchResultCollection result = mySearcher.FindAll();

    AD伺服器的設定範例如下,只有DC本身,不加srv1:

    http://blogs.technet.com/blogfiles/essentialbusinessserver/WindowsLiveWriter/UnderstandingEBSClientLicensing_E5D6/image_thumb_3.png




    • 已移動 albert.cc 2015年4月30日 上午 07:08
    • 已編輯 Albert Hung 2015年4月30日 下午 04:33
    • 已變更類型 George.Chang 2015年5月11日 上午 05:00 Customer Discontinued
    2015年4月29日 下午 05:36

所有回覆

  • 程式開發相關問題未來請移駕到 MSDN 論壇

    因跨論壇貼文,依版規於24小時後以刪文處理。


    蘇老碎碎念
    資訊無涯,回頭已不見岸
    Facebook - 微軟台灣官方論壇愛好者俱樂部
    如何在論壇正確發問,請參考iThome的文章: 如何問到我要的答案

    2015年4月30日 上午 12:06
  • Hi Albert Hung

    程式運作並不一定是登入的動作,但是管理AD就是需要Domain Admin或其他有權限的使用者,所以還是需要做登入驗證的動作,而您客戶的環境限制應該是"限制AD管理者帳號只能在限定的DC上做身分驗證",而不是只有單純的限制要在那台DC面前登入,要不然隨便一台Client安裝AD管理工具,也可以直接登入做管理那這樣的限制是沒有意義的。


    請記得將對您有幫助的回覆"標示為解答"以幫助其他尋找解答及參與社群討論的朋友們。

    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    2015年4月30日 上午 07:19
  • Hi George,

    謝謝您的回覆,我大致了解您的意思

    不過奇怪的是用ASP開發使用ADSI的程式並不受此設定影響

    一樣可以執行帳號管理的相關工作

    即使我們的程式伺服器名稱並沒有加到該帳號可登入到的電腦清單

    唯獨用.Net Framework開發的程式不行...

    2015年4月30日 上午 07:59
  • ASP 使用的是 IIS 的帳戶吧....

    再者你又沒交代你是寫 Windows 的還是 Web 的應用程式。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2015年4月30日 上午 09:03
    版主
  • 不管是Windows程式還是Web程式我都有試過

    而且建立DirectoryEntry本來就可以指定要使用的驗證帳戶跟密碼

    這部分應跟程式類型沒有關係

    問題在於若這個帳戶在AD上有被設定只能登入到AD主機本身

    是不是就不能在其他機器上當作DirectoryEntry的驗證帳戶呢?

    因為進行FindOne()、FindAll()等指令時會被認為是在該台機器上的登入行為?

    即便我的LDAP連線是指向可登入的AD主機

    原先我也覺得如George所描述的原因

    但ASP程式在相同的機器上使用同樣的驗證帳戶卻可以查詢成功

    而不會被AD拒絕

    Set oConnect = Server.CreateObject("ADODB.Connection")
    oConnect.Provider = "ADsDSOObject"
    oConnect.Properties("User ID") = operatorID
    oConnect.Properties("Password") = operatorPWD
    oConnect.Properties("Encrypt Password") = True
    oConnect.Properties("ADSI Flag") = 512
    oConnect.Open
    Set command = Server.CreateObject("ADODB.Command")
    Set command.ActiveConnection = oConnect
    command.CommandText = "<LDAP://192.168.101.131:389/DC=tailspintoys,DC=com>;(&(objectClass=user)(objectCategory=person)(sAMAccountName=001));givenName;subTree"
    Set rs = command.Execute

    2015年4月30日 下午 04:25
  • 管理和搜尋物件是兩種不同的概念,基本上只要是 Domain Users 就能使用 FindOne(), FindAll() 搜尋 AD,問題是你給 DirectorySearcher 什麼帳戶。

    你的 ASP 程式的 operatorID/operatorPWD 是否就是你說的 "只能在 DC 登入的帳戶"?

    ADSI 必須要有一個合法可登入網域的帳戶才能操作 AD。

    依照字面上的解釋,"只能登入到 AD 主機本身" 或許是只能在 DC 上操作,如同 Group Policy 中 "空白密碼的使用者只能登入到主控台" 而進不了 GUI 一樣,操作若是被限縮,那在 AD 主機外自然無法存取 AD。

    我前面之所以問你應用程式類型,是因為不知道你是直接用 application 的帳戶 (IIS 的應用程式帳戶或是 Windows App 直接取用已登入使用者的帳戶,這兩個是天差地遠的組合) 還是用 user 帳戶。

    另外,你的 ASP 程式是否放在 DC,.NET 程式是在 DC 外?


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2015年4月30日 下午 05:23
    版主
  • 切換使用者是一種登入行為。

    它會呼叫 Windows API 中的 LogonUser API,不論是用網域或本機驗證,只要是打算切換或取得某個使用者帳戶的 Context,都要登入。

    Ref: https://msdn.microsoft.com/en-us/library/aa772238%28v=vs.85%29.aspx (ADsOpenObject() function)


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure


    2015年4月30日 下午 05:25
    版主
  • 小朱 您好,

    不論是.NET程式或是ASP程式都是放置在同一台非DC的電腦上

    而程式中指定的AD操作帳戶都是同一個隸屬於Domain Admins群組的帳戶

    只是這個帳戶在AD中有限制能登入的電腦只有AD本身

    做了這個限制後

    ASP的程式依然能做搜尋的動作

    但.NET程式就會出現使用者帳號或密碼錯誤

    直到可登入電腦中也加入此非DC電腦的名稱

    .NET程式FindOne()功能才恢復正常運作

    我可以理解或許這樣對AD做出發送搜尋的行為

    對所在的非DC電腦可能也會有產生類似登入的行為而導致失敗

    只是ASP為何不受此設定影響是我比較納悶的...

    2015年4月30日 下午 05:52
  • .NET 基本上比較嚴謹,它是走原生的 API 處理,也是微軟有在維護的 Framework,自然安全性會比較高。

    ASP 已經有一段時間沒有更新了,它之所以能這樣做,有可能是漏洞... (個人猜測)


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2015年5月1日 上午 03:21
    版主