問題タブ [windows-principal]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Active Directory ユーザーのリストを取得するにはどうすればよいですか (Windows のログオン画面に表示されるユーザーのみ)
Active Directory ユーザーのリストを取得するにはどうすればよいですか (Windows のログオン画面に表示されるユーザーのみ)
Windows Principle ライブラリと WMI Select コマンドを使用して多くの方法を試しました。管理者、ゲスト、その他の VUSRNEIL-DELL を取得し続けています。これら 3 つのユーザー アカウントはいずれもログオン画面に表示されません。これらのユーザー タイプを区別するにはどうすればよいですか?
asp.net-mvc-3 - MVC3Windows認証はUser.Identityをオーバーライドします
MSSQLバックエンドでMVC3を使用してイントラネットアプリケーションを構築しています。認証とロール(カスタムロールプロバイダーを介して)が正しく機能しています。私が今やろうとしているのは、User.Identityをオーバーライドして、User.Identity.FirstNameのようなアイテムを許可することです。しかし、WindowsIdentityでこれを行う方法を示すコードが見つかりません
カスタムプロバイダーを書いてみました:
WindowsAuthenticationをオーバーライドして、カスタムプリンシパルを設定します。
認証機能にブレークポイントがあり、プリンシパルにデータが入力されています。ただし、コントローラーにブレークポイントを設定すると、ユーザーはカスタムプリンシパルではなく、通常のRolePrincipalになります。私は何が間違っているのですか?
編集:
上記のコードをglobal.asaxでコメントアウトしました。C#を使用してAuthorizeAttributeをオーバーライドしました:
そして、私のプリンシパルを次のように調整しました:
ブレークポイントを設定すると、時計はユーザーに次のように表示されます。
- ユーザー
- [CSupport.Model.CPrincipal]
- 身元
IDにアクセスできます。ただし、それでもWindowsIdentity CPrincipalは時計でのみアクセス可能であり、直接アクセスすることはできません。
編集: これに貢献してくれたすべての人に感謝します。さまざまな部品がどのように機能するかについての私の理解が大幅に広がりました。
両方の働き方ができたので、シェアしたいと思いました。
オプション1:Global.asaxの承認リクエストを上書きする
これは私が行っているものです。
Application_AuthenticateRequestを使用しなかったのは、(これによると、Windows認証がオンになっているにもかかわらずHttpContext.Current.Userがnullである)、ユーザーがWindows認証プロセスに入力されていないため、ユーザーを取得するために使用できるものがないためです。情報。
Application_AuthorizeRequestはチェーンの次のものであり、WindowsIDが取り込まれた後に発生します。
これはプリンシパルのオーバーライドです
これは、作成された新しいプリンシパルの更新された情報にアクセスする方法です。
オプション2:AuthorizeAttributeをオーバーライドします
これはオーバーライドされたプリンシパルです(上記と同じです)
これがAuthorize属性のオーバーライドです
ここで、使用するAuthorizeAttributeを変更し、新しい情報を利用します。
オプション1はすべてをグローバルに処理し、オプション2はすべてを個別のレベルで処理します。
dns - ドメインに接続していないときに Active Directory ドメイン グループのリストを取得する方法
私の会社では、カスタム HMI を使用しています。この HMI は、ユーザーが希望する場合、コンピュータのドメインを使用してログインできます。これが現在解決しようとしているシナリオです
ユーザーがドメイン ユーザーとして Windows にログインすると、同じ Windows 資格情報を使用して HMI にログインします。すべてがスムーズに進みます。
ネットワーク接続がダウンし、ユーザーがコンピューターを再起動します。
ユーザーは、同じドメイン ログオンを使用する前と同じように Windows にログインできます (これを許可する Windows キャッシュ ユーザーを使用)。
ユーザーが HMI にログインしようとしましたが、これらのキャッシュされた Active Directory ユーザーにアクセスする方法がわからなかったため、ログインできませんでした。
ユーザーが HMI へのログインを許可されているグループのメンバーであるかどうかを検出するために、現在使用しているコードを次に示します。これらのグループは SQL データベースに保存されSERVER\BUILDER
、たとえば次のように文字列として保存されます。
問題は、ユーザーがドメインに接続していないときにIsInRole
メソッドで例外が発生することです。メソッドのオーバーロードを調べて、リテラル String の代わりに user.Group に相当する SID を使用してみました。これは機能しているように見えますが、別の問題が発生します。ユーザーがネットワークに接続していない場合、グループ名 (SQL の文字列) をこれらの SID に変換できません。
私の現在の回避策は、ユーザーがドメインに接続しているときに、SID とグループをルックアップ テーブル (暗号化) に保存し、ネットワークが接続されていないときに、データベースからグループ名を取得し、文字通り SID をルックアップすることです。テーブル内の文字列。
グループ名をSIDに変換するために使用しているコードは次のとおりです
次に、グループ名を次のように検索します
ネットワーク上にないときにグループ名を SID に変換できない理由はIdentityReference.Translate
、ドメインを認識できないために が例外をスローするためです。
最後に、このすべての説明の後、ここに私が探しているものがあります。グループ名から SID を取得するには、どこかにアクセスできる必要があると考えています。Windows はそれをどこかに保存する必要があるためです。そうしないと、ネットワークに接続していないときに Windows にログインできません。
私は多くの検索を行いましたが、これらのキャッシュされた資格情報がどこに保存されているかを突き止めることができませんでした. 私が十分に明確でない場合はお知らせください。できる限り説明します。
windows - GetUserNameEx でコンピューターのプリンシパル名を取得する
Network Service
次のコードのように実行されているサービスのコンピューター プリンシパル名を取得しようとしました。
私のコンピュータのドメイン名は であるため、 の結果も同じService-Windows@example.com
であると期待しています。buffer
ただし、返されるサービス プリンシパル名はWIN-SC4RKQUKM4D@example.com
. コンピューターを変更してドメインに追加したことは確かですexample.com
。
異常なプリンシパル名についてはわかりません。何が問題なのですか?どんなヒントでも大歓迎です。
アップデート
ドメイン コントローラーでサービスを実行していますが、これが結果に影響するかどうかはわかりません。
ありがとう、そしてよろしく!
c# - DOMAIN\user 形式のユーザー名から WindowsIdentity/WindowsPrincipal を作成する方法
WindowsIdentity(string)
コンストラクターでは、ユーザー名がフォーマットされている必要がありますusername@domain.com
。しかし、私の場合、古いDOMAIN\user
形式の DB からユーザー名を取得します (そして、Windows ロールのメンバーシップを確認する必要があります)。
WindowsPrincipal
古いスタイル (sAMAccountName) のユーザー名から作成する最良の方法は何ですか?
c# - 指定されたユーザー (文字列) がローカル管理者グループのメンバーであるかどうかを検索します
特定したユーザーがローカル管理者グループのメンバーであるかどうかを確認しようとしています。
しかし、私のコードは何もしません...
以下のコードを参照してください。
また、これは my で実行されているpublic void Form1_Load(object sender, EventArgs e) {}
ので、アプリケーションの起動時に毎回行われます。
c# - User.IsInRole(string) と複数のドメイン
WindowsPrincipal.IsInRole(string) を使用して、ユーザーが特定のコントローラー機能にアクセスできるかどうかを確認しており、すべてが正常に機能しています。新しい要件は、2 番目のドメインのユーザーがイントラネット サイトにアクセスする必要があることを意味していたため、一致する AD グループが 2 番目のドメイン内に作成され、それらのユーザーがそれらのグループに割り当てられました。
これらのユーザーは接続できましたが、アクセスは断続的でした。ビューが制限されている場合もあれば、そうでない場合もあります。元のドメインのユーザーが接続すると、制限されたビューへのアクセスがすべて失われたように見えることに注意してください。
元のコードは次のようになります (ドメイン プレフィックスがないことに注意してください)。
当初、AD1\GroupName1 のユーザーはビュー GroupName1 を取得しましたが、AD2\GroupName1 のユーザーが接続するとすぐに、元のユーザーには GroupNameNone ビューが提供されました。人々が接続/切断すると、どのユーザーがチェックに合格するかが変わるようです。
だから私の質問は、ここで何が起こるのですか? グループ名が検索され、SID がバックグラウンドでキャッシュ (または類似) されていますか? 異なるドメインのユーザーが接続すると、キャッシュされた SID が変更されるため、これは適切なようです。
また、(以下のように) チェックの前にドメインを付けることで問題が解決すると想定しています (ただし、まだテストできません)。それについて誰か意見がありますか?それとも、異なるドメインに異なる名前の AD グループを作成する必要がありますか?
ドメイン固有のコード:
ご協力いただきありがとうございます。
c# - 新しいセキュリティ トークンを取得する IsInRole
WindowsPrincipal の IsInRole メソッドを使用して、WPF および Winforms アプリのグループ メンバーシップを確認しています。私は任意の AD ユーザー (実際にコンピューターにログインしているユーザーである必要はありません。私が行っていることによっては、必ずしも認証する必要はありません。基本的な情報レベルのトークンを使用するだけです) 用の ID トークンを生成しています (適切な名前は「IDトークン」だと思います)。
このコードが特定のコンピューターで初めて実行されると、オペレーティング システムは、指定されたユーザーの ID トークンを生成します。その後、そのトークンは IsInRole 関数によって使用され、グループ メンバーシップが検証されます。速いのでとても気に入っています。ただし、WindowsIdentity/WindowsPrincipal を作成するための後続の呼び出しは、新しいトークンを作成するのではなく、既存のトークンを参照します。トークンを更新する方法を知っている唯一の方法は、コンピューターからログアウトするか、再起動することです (これにより、トークン キャッシュがクリアされます)。キャッシュされた ID トークンをリセットするより良い方法を知っている人はいますか?
コード例 C#:
VB: