2016-08-16 9 views
4

次のコードを取得しようとしていますが、問題がある場合もあります。 失敗した場合、0x800704F1というエラーが表示されます。「システムは認証要求を処理するドメインコントローラに接続できません」 失敗した時間の約90%を言います。 私は悲しいことにこれを助けてくれなかったコンテキストタイプの後ろにそれを追加して静的なDCを与えようとしました。 adminユーザーでは、それは常に動作します..しかし、私はユーザーが自分のパスワードを変更できると思われると思います。 user.changepassword行でエラーが発生しましたC#Change AD password Directoryservices

他の誰かが明るいアイデアを持っていれば幸いです。

 using (var context = new PrincipalContext(ContextType.Domain)) 
     { 
      using (var user = UserPrincipal.Current) 
      { 
       try 
       { 
        user.ChangePassword(txt_old.Text, txt_new.Text); 
        user.Save(); 

       } 
       catch(Exception p) 
       { 
        if (p.HResult.Equals("0x800708C5"))//Not secure enough according to password policy 
        { 
         MessageBox.Show("Volgens het systeem is uw nieuwe wachtwoord niet veilig genoeg, voldoet het aan alle eisen?", "Niet gelukt", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
         return; 
        } 
        else if (p.HResult.Equals("0x80070056")) //Wrong current password 
        { 
         MessageBox.Show("U heeft een verkeerd huidig wachtwoord ingevult, probeer het nogmaals", "Verkeerd wachtwoord", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
         return; 
        } 
        else if (p.InnerException.ToString().Contains("0x80070775")) //Temporarly locked out. 
        { 
         MessageBox.Show("Uw account is tijdelijk vergrendeld door te veel pogingen tot in te loggen met een foutief wachtwoord. Probeer het over 15minuten nogmaals of neem contact op met de helpdesk.", "vergrendeld.", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
         return; 
        } 
        else 
        { 
         MessageBox.Show(System.Security.Principal.WindowsIdentity.GetCurrent().Name + Environment.NewLine + p.HResult + Environment.NewLine + p.Message); 
         return; 
        } 
       } 
      } 
     } 

答えて

9

2つのWindowsアップデート3177108と3167679がChangePasswordの動作を変更しました。ここでの問題についてのスレッドがあり

https://social.msdn.microsoft.com/Forums/vstudio/en-US/77dc733e-a13d-4349-9088-8065b85d5c3f/userprincipalchangepassword-stops-working-after-windows-updates-3177108-and-3167679?forum=netfxbcl

それはあなたが今PrincipalContextを作成するときに有効なUPNを指定する必要があること、らしいです。

コンテキストを作成するときにIPをエンドポイントとして使用する前に、正しいドメイン名である必要があります。エラーが発生したとき

さらに、あなたは今、常に同じ例外を受け取る - 私たちは不十分なパスワードを選択するユーザーのためのパスワードポリシーの例外を受信するために使用される、今、我々が得る:

System.DirectoryServices.AccountManagement.PrincipalOperationExceptionを: 認証要求を処理するために、ドメインコントローラーに接続できません。後でもう一度お試しください。 ( HRESULTからの例外:0x800704F1)

がUPDATE 2016年4月10日: 上記の表示の例外は、更新後のChangePasswordを呼び出すときに、一般的な/一般的なエラーがちょうど約何のために受信本当にです。 たとえば、プロトコルに関与するポートの一部がファイアウォールによってブロックされている場合は、これも取得します(ドメインに参加していないサーバー/マシンからコールした場合に適用されます)。

必要なポートのリソース:https://technet.microsoft.com/en-us/library/dd772723(v=ws.10).aspx ダイナミックレンジも必要であることに注意してください。

ユーザーがパスワードを変更できない場合(ドメインポリシーは、次回のログオンフラグを変更する必要があります)、この例外も発生します。

+0

有効なUPNを使用していただきありがとうございます。 – Kage

2

パスワードポリシー違反が発生した可能性があります。つまり、たとえば、ユーザーが最後の5のいずれかにパスワードを変更できないパスワードポリシーがある場合(例として、最後の5つに変更しようとすると、これが表示されます)私の経験で投げられたエラー

ちょうどあなたが(私の場合)を報告し、例外の前にエラーが次のようになります。 に、TargetInvocationException:COMエラーは、Active Directoryのパスワードを変更しようと...

だから私はあなたのパスワードポリシーをチェックし、確認してくださいと思いますこれらのケースでユーザーが違反していないことを確認します。

+0

私たちの場合、パスワード履歴は有効になっていません。パスワードの最小有効期間は0日です。そのような問題は "システムがドメインコントローラに接続して認証要求を処理することができない"という例外を与えますか? – Kage

+0

さらに、ユーザーはまだそれを使用していません。私はちょうどそれを作って、現在それをテストしています。 – Kage

+1

私はあなたが言っていることを聞き、この場合ポリシーではないことを理解しています。システムがドメインコントローラを検出できるかどうかとは無関係で、パスワードの変更が何らかの理由で失敗したかどうかに関係なく、「システムは認証要求を処理するためにドメインコントローラに接続できません」というエラーが表示されます。他のエラー情報がありますか? (内部例外、より詳細な例外?)あなたがもちろん管理者で変更できるという事実は、アクセス権の問題を示唆しています。 – robertpb

2

更新日:10/12/2016: マイクロソフトでは、この資料を更新しましたhttps://support.microsoft.com/en-us/kb/3177108。ここでは、オリジナルの「修正」によって作成された問題と、Kerberosおよびセルフサービスのパスワードリセットを使用するためのヒントを示しました。

2016年10月11日、マイクロソフトではhttps://technet.microsoft.com/en-us/library/security/ms16-101.aspxに関連する修正プログラムをリリースして、元の更新プログラム(ローカルアカウントのパスワードを変更できなくなったという事実を含めてhttps://support.microsoft.com/en-us/kb/3177108で読むことができます)の問題を解決しました。


私は答えがあると信じています。マイクロソフトは最近、NTLMをパスワードの変更に使用できないようにWindowsをパッチしました。

ソリューション番号1(「ハンマー」): コードを実行しているサーバーで、これらのKB更新プログラムのいずれかまたは両方を削除してみてください。

https://support.microsoft.com/en-us/kb/3177108

https://support.microsoft.com/en-us/kb/3167679

あなたが管理者としてのパスワードを変更することができると言うとき、あなたはあなたのフォームアプリケーションは、管理者のマシン上で実行されている場合にのみ意味ですか?アプリケーションが非管理者のマシンで実行されているときの課題はありますか?

私はあなたのコードを取ると同様に、以下の変更などであるとして、それは仕事を得ることができた:

using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "test.user0001")) 

これらのいずれかの行だけでなく、あなた(のいずれかを使用して
using (var user = UserPrincipal.FindByIdentity(context, IdentityType.UserPrincipalName, "[email protected]")) 

現在のユーザーを取得する)管理者パスワードと管理者以外のパスワードを同じように変更することができました。私の質問は、管理者以外のマシンでフォームアプリケーションを実行しているときにエラーが発生するかどうかです。

+0

確かにサンプルを使用することはできますが、これはaspxアプリケーションではありません。そのウィンドウがどのようになっているのでしょうか? – Kage

+0

Windowsフォームアプリケーションでコードをテストした後、回答を編集しました。 – robertpb

+0

アプリはいつも私の管理者マシンで働いていましたが、通常のユーザーとして通常のターミナルサーバーで試してみると問題がありました。私もあなたのバリエーションを試してみましたが、どちらも問題があります。おそらくActive Directoryの許可が間違っていますか? – Kage

1

これは、2つの異なる状況でsysadmin側から確認されました。パスワード管理機能を備えた2つのアプリケーションを、新しくデプロイされた2台のサーバーにインストールする必要がありました。どちらの場合も、パスワードの変更は、アプリケーションがドメインコントローラに接続できないというエラーで失敗しました(実際にそこにあって利用可能でした)。

1つのアプリケーションがベンダー提供のクローズドソース(CyberArk's Privileged Session Manager)であり、もう1つは現在作業中の顧客が開発した社内アプリケーションです。 2番目のケースでは、元の質問に使用されたコードと実際に似ていたコードを見ることができました。

悲しいことに、コードを実際に修正することは、どちらの場合でもオプションではありませんでした。最初のアプリケーションではアプリケーションベンダーにバグを報告しなければなりませんでしたが、2番目のバグは内部開発チームどちらの場合でもアプリケーションで即座に修正することはできませんでした。管理者は両方のアプリケーションが正常に動作するようにしました今度はですので、問題のアップデートを削除する必要がありました(これは悪いことですが解決策ではなく怠け者で危険な回避策ですが、だから... meh)。とにかく

、私はこの答えでジャンプだ理由:離れてKB3177108KB3167679の除去から、私の場合には(どちらの場合も)我々はまたKB3175024KB3174644を削除する必要がありました。 2つの更新プログラムがインストールされていても、最初の2つを削除してもパスワード変更機能はまだ動作しません。

だから、あなたは、コードを修正することはできませんし、KB3177108とKB3167679を削除しても問題が解決しない状況で自分自身を見つける場合は、あなたはまた、KB3175024とKB3174644を削除してくださいすることができます。