1. 程式人生 > >統計頻繁被鎖定的AD帳號

統計頻繁被鎖定的AD帳號

powershell shell

數據處理流程
  1. 在PC端執行排程腳本遠程控制DC作業,導出7天內帳號的鎖定Event;
  2. 通過PC218中轉至Linux247;
  3. 在Linux247執行排程對數據進行Model格式化,過濾出(50次/月)的數據。
  4. 通過訪問訪問\\*.247可訪問共享,(每28天的星期三)拿到處理過的文件(ad20170101.txt..),
graph LR

a[PC<br>218<br>D:\PS\AccountLockOut]-->|task<br>robocopy|b[DC<br>240<br>D:\PS\AccountLockOut]
b-->|csv file|a
a-->|task<br>robocopy|c[Linux<br>247<br>/backup/ad]
c-->|task<br>samba|d[PC<br>Client]
  • 腳本一:
    因Windows默認不允許直接在排程運行powshell腳本(服務器有更多限制),所以選擇在PC運行Bat腳 本。

    powershell  D:\PS\AccountLockOut\Start-AccountLockOut.ps1   
  • 腳本二:
    發送本地腳本文件到DC上執行(便於管理)。
    
    $CredUser="ikulin"    #定義用戶
    $PWD=ConvertTo-SecureString "Iku963" -AsPlainText -Force    #定義密碼,轉換安全字符,強制明文
    $Cred=New-Object System.Management.Automation.PSCredential($CredUser,$PWD)   #定義認證對象

Invoke-Command -FilePath "D:\PS\AccountLockOut\Get-AccountLockOut.ps1" -ComputerName 10.10.10.10 -Credential $Cred

net use \10.10.10.10 \D$\PS\AccountLockOut Se1.. /u:f2844707_
robocopy \10.10.10.10 \D$\PS\AccountLockOut D:\PS\AccountLockOut\LOG
net use \10.10.10.247\ad digit /u:adfffff
robocopy D:\PS\AccountLockOut\LOG \10.134.145.247\ad

net use /d * /y


- **腳本三:**  
讀取7天內帳號的鎖定日誌並導出csv文件。

[CmdletBinding()]

param(
[INT]$Num=7
)
$After=((Get-Date).adddays(-$Num+1)).ToString(‘yyyy-MM-dd‘)
$Before=(Get-Date).ToString(‘yyyy-MM-dd‘)
$Filename="D:\PS\AccountLockOut\"+"$After"+‘-‘+"$Before"+‘.csv‘

Get-EventLog -LogName Security -After $After -InstanceId 4740 |
select @{Name="USER";Expression={(($_.Message).Split(":"))[8].Trim().Split("")[0]}},
    @{Name="TIME";Expression={$_.TimeGenerated}},
    @{Name="COMPUTER";Expression={(($_.Message).Split(":"))[10].Trim()}} |

Export-Csv  -Encoding UTF8 -path  "$Filename" -Force 

- **腳本四:**  
使用shell腳本過得數據。

#!/bin/bash
#Date:2017-09-21
#Version:1.0.0
#Author:linxianyu
#Description:Format out for AD AccountLock.csv

#將鎖定次數超過50次的帳號統計並存入變量a

a=$(cut -d ‘,‘ -f 1 $@ | sort | uniq -c | sort -n |
awk -F ‘ ‘ ‘{ if ($1>50) print $1,$2 }‘ |
tr -d ‘"‘ )

#打印變量a的內容
#因從變量輸入原格式會改變,所以有awk對輸出格式化

echo $a|
awk -F ‘ ‘ ‘ BEGIN{printf "%15-s %10-s \n","Statistics","Account";
print "-----------------------------"}
{ for(i=1;i<=NF;i++){if(i%2==1){printf "%-10s \t",$i } else{printf "%-10s\n",$i}}}
END{print "-----------------------------"}‘

#將變量a中的帳號篩選並存入變量b

b=$(echo $a | awk -F ‘ ‘ ‘{for(i=1;i<=NF;i++){if(i%2==0){print $i }}}‘)

#for循環數組變量b中的帳號並再次查找、統計、打印
#若同一帳號在不同pc上登陸則分開打印

for i in ${b[@]};
do

    grep "$i" $@ |

    cut -d "," -f1,3 |
    cut -d ":" -f2 |
    sort -t ‘,‘ -k2 |
    sed -e ‘s#"##g‘ -e ‘s#,#\t#g‘ |

#清除pcname中與帳號同名的行

    grep "^$i" |
    uniq -c |
    sort -b -k2

done


- **腳本六:**  
調用tj.sh統計腳本,計算周期。

#!/bin/bash
#Date:20171121
#Version:1.0
#Discription: The creat date for tj.sh

path=/backup/ad
cd $path

#測試文件是否存在
[ -e missionnum ]

if [ $? = 0 ];
then

#查看運行資料
num=$(cat missionnum)

#定義循環4次(周)調用一次腳本
mouth=4

#判斷是否滿足4周
if [ $num -ne $mouth ];
then
#循環計數+1
echo $[ num += 1 ] > missionnum

    else

#定義文件名
filename=$(date +"ad%Y%m%d.txt")
#查找4周內產生的日誌並調用執行腳本tj.sh
find -name "2017-*" -mtime -28 | xargs sh tj.sh > $filename
#進行linux to windows文本格式轉換
unix2dos $filename
#重置計數
echo 1 > missionnum

    fi

else

#若無計數文件則創建(因第一次執行後值因為2所以直接賦值2)
echo 2 > missionnum

fi

- **腳本七:**  
計劃任務調用mission.sh腳本。

08 17 3 sh /backup/ad/mission.sh


- **導出的csv文本:**

#TYPE Selected.System.Diagnostics.EventLogEntry
"USER","TIME","COMPUTER"
"Administrator","2017/11/29 下午 12:14:18","SKY"
"7000045","2017/11/29 下午 12:06:53","7000045"
"7006968","2017/11/29 下午 12:02:35","2835276"
"4294141","2017/11/29 上午 11:53:51","CHE"
"Administrator","2017/11/29 上午 11:48:39","SKY"

- **最終的文本:**

[root@bogon ~]# cat /backup/ad/ad20171122.txt
Statistics Account

60 2844290A
61 1107049
113 7000773
126 4734316
163 6000029
249 2832332
482 7000045
971 Administrator

 60 2844290A       LH-138
 15 1107049        1107049
 42 1107049        1107049S
  4 1107049        5123384
 97 7000773        9OMPZW0G1FMLI5U
  5 7000773        1308027
  2 7000773        H3-4F-R-028
  3 7000773        PC201709210754

統計頻繁被鎖定的AD帳號