none
一般アカウントでドメイン参加させたコンピュータの件数確認 RRS feed

  • 質問

  • お世話になります。

    一般権限のドメインアカウント(「Authenticated Users」グループに所属するユーザーアカウント)で、コンピュータをドメイン参加させているのですが、そのユーザーで現時点で何台のコンピュータをドメイン参加させているかを確認する方法が分かりません。

    初期状態で1ユーザーアカウントあたり10コンピューターまでという制限を無制限にすれば良いかもしれませんが、どちらにせよ前述のコンピュータ数を確認する方法を確立しておきたいと思っています。

    「ADSI Edit」など試してみましたが、どれもいまいちで、結局VBScriptにて作りこみをしている最中ですが以下の問題が発生しました。

    ・GetObjectメソッド利用してコンピュータアカウントの「mS-DS-CreatorSID」の値を抽出し、ユーザーのSIDとマッチングしてカウントを試みましたが、「mS-DS-CreatorSID」はバイナリ値として取得されてしまい、ユーザーSIDの文字列との比較ができません。

    以下のサイトを見ると、「mS-DS-CreatorSID」は「String」と表記されているのですが、バイナリ値で取得されてしまいます。。。

    https://docs.oracle.com/cd/E19225-01/821-0779/bzafh/index.html

    コードは以下の内容しか書いていないのですが。

    set objUser = GetObject("LDAP://<DN名>")
    strA = objUser.Get("mS-DS-CreatorSID")

    【環境】

    Windows Server 2012 R2

    ※VBSはサーバ上で実行しています。

    どなたか、解決方法をご教示いただけると幸いです。


    【追加情報】

    以下のコマンドをADサーバーのコマンドプロンプトで実行すると、16進表記で表示されました。

    dsquery * "<DN名>" -attr *
    
    mS-DS-CreatorSID: 0x01 0x05 0x00 0x00 0x00 0x00 0x00 0x05 0x15 0x00 0x00 0x00 0x8d 0x0a 0x14 0x04 0x98 0x02 0xa0 0x21 0x5b 0xbb 0xb6 0x94 0xd2 0x04 0x00 0x00
    

    • 編集済み mu_seed 2019年2月15日 8:17
    2019年2月15日 8:11

回答

  • チャブーンです。

    この件ですが、やはり調べた方はいるようで、答えはしたのページに書いてありますね。

    https://blogs.technet.microsoft.com/leesteve/2017/06/14/ps-without-bs-how-many-times-have-you-joined-the-domain/

    要するに変換しないとダメなのですが、変換には、新たに"New-Object System.Security.Principal.SecurityIdentifier"を定義する必要があります。動くかどうか、わかりませんが、したのようなコードになると思います。

    これですが、PowerShellを使うと.SIDプロパティで値を変換してくれますので、とくに変換式は不要です。簡単に検証した結果を、コーディングしておきます。

    [Microsoft.ActiveDirectory.Management.ADAccount[]]$Computers=Get-ADComputer -Filter {ms-DS-CreatorSID -like "*"} -Properties ms-DS-CreatorSID | Where {$_."mS-DS-CreatorSID".Value -eq (Get-ADUser <ユーザー名>).Sid.Value}
    Write-Host ユーザーが参加させたコンピューター数は、以下の ($Computers).Count 台です。
    $Computers


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。








    2019年2月15日 11:10
    モデレータ
  • チャブーンです。

    ご要望の機能は、以下のPowerShellでうまくいきそうです。ActiveDirectoryモジュールを入れられない環境ではSystem.DirectoryServices.DirectorySearcherから検索を行えばよいでしょう。

    $User=[System.Security.Principal.WindowsIdentity]::GetCurrent()
    $UserSID=$User.User.Value
    $UserName=$User.name
    [Object[]]$Computers=(New-Object DirectoryServices.DirectorySearcher "(&(ObjectClass=computer)(ms-DS-CreatorSID=$UserSID))").FindAll() | Select @{Name="Name";Expression={$_.properties.name}},Path
    Write-Host ユーザー $UserName が参加させたコンピューター数は、以下の ($Computers).Count 台です。
    $Computers | FT -AutoSize


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2019年2月18日 10:03
    モデレータ

すべての返信

  • チャブーンです。

    この件ですが、やはり調べた方はいるようで、答えはしたのページに書いてありますね。

    https://blogs.technet.microsoft.com/leesteve/2017/06/14/ps-without-bs-how-many-times-have-you-joined-the-domain/

    要するに変換しないとダメなのですが、変換には、新たに"New-Object System.Security.Principal.SecurityIdentifier"を定義する必要があります。動くかどうか、わかりませんが、したのようなコードになると思います。

    これですが、PowerShellを使うと.SIDプロパティで値を変換してくれますので、とくに変換式は不要です。簡単に検証した結果を、コーディングしておきます。

    [Microsoft.ActiveDirectory.Management.ADAccount[]]$Computers=Get-ADComputer -Filter {ms-DS-CreatorSID -like "*"} -Properties ms-DS-CreatorSID | Where {$_."mS-DS-CreatorSID".Value -eq (Get-ADUser <ユーザー名>).Sid.Value}
    Write-Host ユーザーが参加させたコンピューター数は、以下の ($Computers).Count 台です。
    $Computers


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。








    2019年2月15日 11:10
    モデレータ
  • チャブーン様

    いつもお世話になっております。

    ご回答ありがとうございます。

    PowerShellは完全に眼中になかったです、新しい発想をありがとうございます。

    記載していただいたコードが手元の環境でも、期待している結果を返してくれるところまで確認できました。

    あと欲を言えば、現在ADサーバ上で台数のカウントをしていますが、これがドメイン参加している端末でかつ、参加に利用したユーザーアカウントの権限で確認が出来るとさらにうれしいのですが、そこの仕組みはこれから検討してみたいと思います。

    (ユーザー自身がどの端末にドメイン参加したのかを、いつでも確認できれば、10台という制限を意識しやすくなるかなと考えています。)

    2019年2月18日 1:59
  • チャブーンです。

    ご要望の機能は、以下のPowerShellでうまくいきそうです。ActiveDirectoryモジュールを入れられない環境ではSystem.DirectoryServices.DirectorySearcherから検索を行えばよいでしょう。

    $User=[System.Security.Principal.WindowsIdentity]::GetCurrent()
    $UserSID=$User.User.Value
    $UserName=$User.name
    [Object[]]$Computers=(New-Object DirectoryServices.DirectorySearcher "(&(ObjectClass=computer)(ms-DS-CreatorSID=$UserSID))").FindAll() | Select @{Name="Name";Expression={$_.properties.name}},Path
    Write-Host ユーザー $UserName が参加させたコンピューター数は、以下の ($Computers).Count 台です。
    $Computers | FT -AutoSize


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2019年2月18日 10:03
    モデレータ
  • チャブーン様

    お返事が遅くなりました。

    PowerShellのコード解析に時間がかかってしまいました(読み慣れていないもので。。。)

    ご教示いただいたコードで目的の情報が取り出せることが確認できました。ありがとうございました。

    P.S.

    今までVBScriptばかり利用していましたが、PowerShell にも後発なだけあって多機能で痒いところに手が届くかんじで便利ですね。

    • 編集済み mu_seed 2019年2月19日 6:31
    2019年2月19日 6:29