PowerShellを使用したSharePointのエントリを使用して、VBSを介してADのユーザーを監査する

こんにちは、UFOオブザーバー


ADからユーザーに関する情報を収集し、読みやすくするためにSharePointに情報を投稿する方法を説明し、必要な情報をいつでもどのユーザーについて確認したかったのです。

それがすべてだったので、私は単にそれを説明します...



タスクは、ADからユーザーに関する情報を収集することであり、その情報と特定の目標を収集します。

理由:VBSは、LDAPを介してユーザー情報を収集するために選択され、すべてを単純なテキストファイルに収集します(収集は互いに分離されたいくつかのセグメントで行われるため)、ファイルは1か所で収集され、PowerShellを使用して準備されたSharePointサイトでホストします。



On Error Resume Next Dim oQuery Dim objConnection Dim objCommand Dim objRecordSet Dim strMember Dim strAC Dim arrMember '       logfile = "users-lvs.txt" Set objFSO = CreateObject("Scripting.FileSystemObject") oQuery = "<LDAP://dc=my,dc=site>;" & _ "(objectCategory=user)" & _ ";distinguishedName,name,sAMAccountname,mail,memberOf,userAccountControl,description;subtree" '            Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Open "Provider=ADsDSOObject;" objCommand.ActiveConnection = objConnection objCommand.CommandText = oQuery Set objRecordSet = objCommand.Execute '    - ,   -  if objFSO.FileExists(logfile) then Set objFile = objFSO.OpenTextFile(logfile, 2) objFile.Write "" else Set objFile = objFSO.CreateTextFile(logfile) objFile.Close Set objFile = objFSO.OpenTextFile(logfile, 2) objFile.Write "" end if objFile.Close '  ,     While Not objRecordSet.EOF strMember = objRecordSet.Fields("memberOf") strStr = "" For i = 0 To UBound(strMember) '        liluka = InStr(2, strMember(i), ",", vbTextCompare) '       strStr = strStr & Right(Left(strMember(i), liluka - 1), liluka - 4) & ", " Next arrOpis = objRecordSet.Fields("description") strOpis = "" For i = 0 To UBound(arrOpis) strOpis = strOpis & arrOpis(i) & ", " Next '      Select Case objRecordSet.Fields("userAccountControl") Case 512 strAC = "" Case 514 strAC = "" Case 66048 strAC = "" Case 66050 strAC = "" End Select '      Set objFile = objFSO.OpenTextFile(logfile, 8) objFile.WriteLine objRecordSet.Fields("sAMAccountname") & ";1" & _ objRecordSet.Fields("name") & ";2" & _ objRecordSet.Fields("mail") & ";3" & _ strStr & ";4" & strAC & ";5" & strOpis & ";6" objFile.Close objRecordSet.MoveNext Wend objConnection.Close
      
      







このコードは、行の最後に「; 6 LAN」が追加されていることを示しています。前述のとおり、いくつかのセグメントがあり、これが最初のLANです。 サインオフすると、ユーザーは長い間考えず、私たちが遭遇した4つの値を取りました。人生を複雑にし、掘るなら、変数をビット単位で読み取ることができます...

PowerShellスクリプトが情報の場所を理解するためには、セミコロンを使用して特定の情報のインデックスを示す数字を入力するよりも良い方法を考え出さないでください。

専門家ではなく、プログラミングと分析/解析が好きなコードの恋人です。

実際には、PowerShellコード自体:

 #          ,  write-host open Sharepoint from USERS # sharepoint $env:SPpath = "${env:CommonProgramFiles}\Microsoft Shared\web server extensions\12\" [System.Reflection.Assembly]::LoadFrom("$env:SPPath\ISAPI\Microsoft.SharePoint.dll") write-host open web #  web $nsite="http://my_site/sites/MonitorUser" $SpSite = New-Object -TypeName "Microsoft.SharePoint.SPSite" -ArgumentList $nsite; $spweb=$spsite.OpenWeb(); write-host open Sharepoint list #   $nlist="http://my_site/sites/MonitorUser/Lists/List5/AllItems.aspx" $splist=$spweb.getlist($nlist); #   write-host clearing list... $iCnt = $splist.Items.Count; #$icnt; for ($jj=1; $jj -le $iCnt; $jj++){ $splist.Items.Delete(0); } write-host clearing list Done #      ,     write-host Processing log files... foreach ($file in $(get-childitem 'D:\scripts\work\' -include users*.txt -recurse)) { $hostout = $file.FullName + "..." Write-Host $hostout $fl = get-content $file.FullName; # $fl; for ($i=1; $i -lt $fl.Count; $i++) { $st1 =$fl[$i]; #       $ind1 = $st1.IndexOf(";1") $ind2 = $st1.IndexOf(";2") $ind3 = $st1.IndexOf(";3") $ind4 = $st1.IndexOf(";4") $ind5 = $st1.IndexOf(";5") $ind6 = $st1.IndexOf(";6") $stLogin = $st1.substring(0,$ind1) $stUserName = $st1.substring($ind1+2,$ind2-$ind1-2) $stMail = $st1.substring($ind2+2,$ind3-$ind2-2) $ind7 = $ind4-$ind3 if ($ind7 -eq 2) { $stGroup = " " } else { $stGroup = $st1.substring($ind3+2,$ind4-$ind3-4) } $ind7 = $ind6-$ind5 if ($ind7 -eq 2) { $stOpis = "" } else { $stOpis = $st1.substring($ind5+2,$ind6-$ind5-4) } $stBlock = $st1.substring($ind4+2,$ind5-$ind4-2) $stSeg = $st1.substring($ind6+2,3) #         $NewItem = $SpList.Items.Add(); $NewItem[""] = $stLogin; $NewItem[" "] = $stUserName; $NewItem["e-mail"] = $stMail; $NewItem[""] = $stGroup; $NewItem[""] = $stBlock; $NewItem[""] = $stSeg; $NewItem[""] = $stOpis; $NewItem.Update(); } } write-host Processing log files DONE $spweb.Dispose(); $spsite.Dispose(); write-host Program END
      
      







1か所でtxtを収集した後、バッチファイルを起動します

 cscript users-lvs.vbs %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "& 'D:\scripts\work\users.ps1'" %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "& 'D:\scripts \work\pk.ps1'"
      
      





このサイトはLANセグメントで実行されているため、同時にこれらのユーザーの情報を更新します。 お気づきかもしれませんが、作業スクリプトはコンピューター上の情報(OS、バージョン、パック、説明、電源がオンになったとき)を収集しますが、ユーザーと同様にすべてがそこにあります。

すべてを取り込む最も長い時間は、情報を含むページをクリアすることです(約2〜3分)。 ページが空白の場合、合計で複数のファイルを収集して処理するには、700〜800レコードの30秒しかかかりません。

実際、LDAPには多くの情報があり、ユーザーが最後にログインしたときと、最後にパスワードを変更したときを見るという事実によって、作業スクリプトに追加されています。 WMIには「ディレクトリ\ LDAP」があり、原則として、多くの興味深い情報を見つけることができます。



PS私はすぐにそれに手を入れました、どんな批判にも喜んでいますが、それを改善する方法、どの瞬間が好きではないのか、なぜこれを主張するのかについてアドバイスする方が良いです...



All Articles