少量の血液インベントリ

「インベントリ」を実行する必要があった場合、つまり、どのユーザーがどのコンピューターに座っていたかを調べる必要がありました。



職場を見て回り、尋ねてみるという選択肢は、異端として捨てられました。

すべてのユーザーはワークステーションと同様にActive Directoryにログインしているため、ADから必要な情報をすべて削除するというアイデアが生まれました。 もちろん、ドメイン管理者に連絡して、彼からすべてのデータを尋ねることはできますが、簡単な方法は探していません。



したがって、インベントリには次のものが必要です。





そして、最も重要な条件は、サードパーティのアプリケーションをコンピューターにインストールすること、「正しい」言語でアプリケーションを作成することも極端に気が進まないことです。 したがって、VBSは実装に選択されました。VBSには必要なものがすべて揃っており、設定する必要がないため、その環境は最も軽量なnotepad.exeです。

ネットワーク名を使用すると、すべてが単純で、ディレクトリサービスにあります。 VBSからADを操作する例は、かなり迅速にグーグルで検索されました。 オブジェクトの属性のリストを取得するために、記述されたスクリプトが使用されました

仲間Andrew J. Healey listAllProperties

そのため、このような単純なスクリプトでコンピューター名を取得することがわかりました。

set cn=CreateObject("ADODB.Connection") set cmd=CreateObject("ADODB.Command") cn.Provider="ADsDSOObject" cn.Open "Active Directory Provider" set cmd.ActiveConnection=cn  SQL    Active directory     "Computer" cmd.CommandText="SELECT * FROM 'LDAP://DC=***,DC=ru' WHERE objectClass='Computer'" set objRecordSet=cmd.Execute on error resume next do while Not objRecordSet.Eof set objComputer=GetObject(objRecordSet("adspath")) '    ,       '   ,    if(inSTR(1,objComputer.distinguishedName,"OU=Garbage",vbTextCompare) = 0)then wscript.echo objComputer.CN '        end if objRecordSet.MoveNext Loop
      
      







次に、これらのコンピューターのポピーアドレスを取得する必要があります。 ここではすべてが単純で、標準ユーティリティ「nbtstat」と「-a」パラメーターを使用して、目的のパラメーターを取得できます(もちろん、arp -aには別のオプションがありますが、常に機能するとは限りません)。

  set oShell=Wscript.CreateObject("wscript.shell") set re=new regexp '   MAC  re.Pattern = "[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}" '    ComputerNetworkName       AD set oExec=oShell.Exec("nbtstat -a" & ComputerNetworkName) for each obj in re.execute(oExec.StdOut.ReadAll) GetData=obj.value next
      
      





ここで、「このコンピューターに登録されているユーザーのリストを取得できる場所はどこですか?」という疑問が生じます。 短いグーグルで、リモートwmiスクリプトの実行に要約された多くのメソッドが見つかりました。 ドメインではリモートスクリプトの実行が禁止されているため、このパスは私には向いていませんでした。 そして、Windowsでは、デフォルトで、ネットワーク上の2つのレジストリブランチ、つまり「HKEY_USERS」と「HKEY_LOCAL_MACHINE」が読み取り可能であることを思い出しました。

これは、「reg」ユーティリティを使用して登録ユーザーのSIDを取得できることを意味し、MACアドレスを取得するために使用したコードがこれに役立ちます。変更する必要があるのは通常のテンプレートとコマンドテキストだけです。

  set oShell=Wscript.CreateObject("wscript.shell") set re=new regexp '   SID    reg query re.Pattern = "S-\d+-\d+-\d+-\d+-\d+-\d+-\d+" '    ComputerNetworkName       AD set oExec=oShell.Exec("reg query \\" & iComputerNetworkName&"\HKEY_USERS") for each obj in re.execute(oExec.StdOut.ReadAll) GetData=obj.value next
      
      





まあ、私たちは良い種を持っていますが、それらは名前において全く似ていません。 名前を取得するには、ADに再度連絡する必要があります。

ADの各オブジェクトには「objectSID」フィールドがあります。これは、ユーザーに関する情報を選択できることを意味するため、ここに座っています。 これを行うには、コンピューターのリストを取得するために使用したコードを使用し、その中のフィールド「cmd.commandtext」のクエリを変更します。



  dim cn,cmd,objRecordSet set cn=CreateOBject("ADODB.Connection") set cmd=CreateObject("ADODB.Command") cn.Provider="ADsDSOObject" cn.Open "Active Directory Provider" set cmd.ActiveConnection=cn ' objSid       . cmd.CommandText="SELECT * FROM 'LDAP://DC=***,DC=ru' where objectClass='User' and objectSid='"& objSid &"' " set objRecordSet=cmd.Execute '      if( not objRecordSet.Eof) then set objUser=GetObject(objRecordSet("adspath")) if(inSTR(1,objUser.distinguishedName,"OU=Garbage",vbTextCompare) = 0)then '    ,      ,   . Wscript.Echo objUser.FirstName &" "& objUser.LastName &" "& objUser.Patronim end if end if
      
      





必要なデータはすべて受信されています。将来変更されたとしても、それらの取得は問題になりません(もちろん、ディレクトリサービスが再編成されない限り)。 そして最も重要なことは、コンピューターとユーザーを探して企業全体を走り回る必要がなかったことです。



All Articles