आप फ़ाइल सिस्टम ऑब्जेक्ट एक्सेस इवेंट ऑडिटिंग का उपयोग करके उस विशिष्ट उपयोगकर्ता की पहचान कर सकते हैं जिसने किसी विशिष्ट फ़ाइल को बनाया, हटाया या संशोधित किया। इस लेख में, हम आपको दिखाएंगे कि Windows Server 2016 पर शेयर्ड नेटवर्क फ़ोल्डर पर फ़ाइलों के लिए इवेंट ऑडिटिंग कैसे कॉन्फ़िगर करें। ऑडिटिंग कॉन्फ़िगर करने के बाद, आप इवेंट व्यूअर से जानकारी का उपयोग करके फ़ाइल सर्वर पर विशिष्ट फ़ाइल को हटाने वाले उपयोगकर्ता को ढूंढ सकते हैं।
जब आप शेयर्ड नेटवर्क फ़ोल्डर से कोई फ़ाइल हटाते हैं, तो यह उपयोगकर्ता के रीसायकल बिन में भेजे जाने के बजाय तुरंत हटा दी जाती है। शेयर फ़ोल्डर पर खोली गई फ़ाइलों की सूची निम्नानुसार प्राप्त की जा सकती है।
Windows पर फ़ाइल और फ़ोल्डर एक्सेस ऑडिटिंग पॉलिसी कैसे सक्षम करें?
डिफ़ॉल्ट रूप से, Windows Server पर फ़ाइल सिस्टम ऑब्जेक्ट एक्सेस ऑडिट सक्षम नहीं है। आप ग्रुप पॉलिसी का उपयोग करके ऑडिट सेटिंग्स को सक्षम और कॉन्फ़िगर कर सकते हैं। यदि आपको कई सर्वरों या कंप्यूटरों पर ऑडिट पॉलिसी सक्षम करने की आवश्यकता है, तो आप डोमेन GPO का उपयोग कर सकते हैं (gpmc.msc mmc कंसोल का उपयोग करके कॉन्फ़िगरेबल)। यदि आप केवल एक सर्वर पर ऑडिटिंग कॉन्फ़िगर करना चाहते हैं, तो आप लोकल ग्रुप पॉलिसी एडिटर का उपयोग कर सकते हैं।
- लोकल ग्रुप पॉलिसी एडिटर कंसोल खोलें –
gpedit.msc; - उन्नत ऑडिट पॉलिसी वाले GPO सेक्शन पर जाएं: Windows Settings → Security Settings → Advanced Audit Policy Configuration → Object Access;
- Audit File System नीति खोलें और निर्दिष्ट करें कि आप केवल फ़ाइल सिस्टम ऑब्जेक्ट्स के सफल एक्सेस इवेंट लॉग करना चाहते हैं (Configure the following audit events → Success); आप Windows Settings → Security Settings → Local Policy → Audit Policy के तहत Audit Object Access नीति का उपयोग करके लोकल ऑब्जेक्ट एक्सेस ऑडिटिंग भी सक्षम कर सकते हैं। हालांकि, फ़ाइल सिस्टम ऑडिट पॉलिसी का उपयोग करना बेहतर है क्योंकि यह केवल NTFS एक्सेस इवेंट को ट्रैक करता है।

- परिवर्तन सहेजें और कमांड का उपयोग करके अपनी लोकल ग्रुप पॉलिसी सेटिंग्स अपडेट करें:
gpupdate /force।
शेयर्ड फ़ोल्डर पर फ़ाइल हटाने की ऑडिट सेटिंग्स कॉन्फ़िगर करना
अब आपको उस शेयर्ड नेटवर्क फ़ोल्डर के गुणों में ऑडिटिंग कॉन्फ़िगर करने की आवश्यकता है जिस तक आप एक्सेस ट्रैक करना चाहते हैं। फ़ाइल एक्सप्लोरर चलाएं और फ़ोल्डर गुण खोलें। Security टैब पर जाएं। Advanced बटन पर क्लिक करें → Auditing टैब पर जाएं।
यदि संदेश "You must be an administrator or have been given the appropriate privileges to view the audit properties of this object" दिखाई देता है, तो Continue बटन पर क्लिक करें।

फिर उस उपयोगकर्ता या समूह को निर्दिष्ट करने के लिए Add बटन पर क्लिक करें जिसके लिए आप ऑडिट इवेंट कैप्चर करना चाहते हैं। यदि आप सभी उपयोगकर्ताओं के लिए एक्सेस इवेंट ट्रैक करना चाहते हैं, तो Everyone समूह निर्दिष्ट करें।
फिर आपको यह निर्दिष्ट करने की आवश्यकता है कि ऑब्जेक्ट तक पहुंचने के लिए उपयोग की जाने वाली कौन सी अनुमतियों को लॉग किया जाना चाहिए। इवेंट लॉग में केवल फ़ाइल हटाने की घटनाओं को सहेजने के लिए, Show advanced permissions बटन पर क्लिक करें। इवेंट सूची में, केवल फ़ोल्डर और फ़ाइल हटाने की घटनाओं के लिए ऑडिटिंग छोड़ें – Delete और Delete subfolders and files।

PowerShell का उपयोग करके ऑडिट नियम कॉन्फ़िगर करें:
$Path = "E:\Public"
$AuditChangesRules = New-Object System.Security.AccessControl.FileSystemAuditRule('Everyone', 'Delete,DeleteSubdirectoriesAndFiles', 'none', 'none', 'Success')
$Acl = Get-Acl -Path $Path
$Acl.AddAuditRule($AuditChangesRules)
Set-Acl -Path $Path -AclObject $Acl
अब, यदि उपयोगकर्ता शेयर्ड नेटवर्क फ़ोल्डर में किसी भी फ़ाइल या फ़ोल्डर को हटाता है, तो File System → Audit Success फ़ाइल डिलीट इवेंट Security लॉग में Event ID 4663 के साथ Microsoft Windows security auditing स्रोत से दिखाई देता है।
Event Viewer mmc कंसोल खोलें (eventvwr.msc), Windows Logs → Security सेक्शन का विस्तार करें। EventID 4663 द्वारा इवेंट लॉग फ़िल्टर सक्षम करें।

इवेंट व्यूअर में शेष किसी भी इवेंट को खोलें। जैसा कि आप देख सकते हैं, इसमें हटाई गई फ़ाइल का नाम, फ़ाइल को हटाने वाले उपयोगकर्ता का खाता और प्रक्रिया का नाम शामिल है।
An attempt was made to access an object. Subject: Security ID: CORP\jsmith Account Name: jsmith Account Domain: CORP Logon ID: 0x32B12627 Object: Object Server: Security Object Type: File Object Name: E:\Distr\Backup.rar Handle ID: 0x7bc4 Resource Attributes: S:AI Process Information: Process ID: 0x4 Process Name: Access Request Information: Accesses: DELETE Access Mask: 0x10000

फ़ाइल एक्सेस ऑडिटिंग पॉलिसी सक्षम करने के बाद, आप Security लॉग में पा सकते हैं:
- शेयर्ड नेटवर्क फ़ोल्डर से फ़ाइल किसने हटाई और कब;
- फ़ाइल को हटाने के लिए किस एप्लिकेशन (प्रक्रिया) का उपयोग किया गया था;
- रिस्टोर करने के लिए बैकअप की तारीख क्या है।
फ़ाइल डिलीशन इवेंट को SQL डेटाबेस (MySQL/MSSQL) में कैसे लिखें?
हालांकि, भले ही हटाई गई फ़ाइलों का ऑडिट सक्षम हो, लॉग में कुछ ढूंढना परेशानी भरा हो सकता है। सबसे पहले, हजारों इवेंट्स के बीच एक विशिष्ट एंट्री ढूंढना काफी कठिन है (Windows में लचीले फ़िल्टर के साथ इवेंट खोजने के लिए कोई सुविधाजनक टूल नहीं है)। दूसरा, यदि फ़ाइल बहुत समय पहले हटाई गई थी, तो यह इवेंट लॉग में अनुपस्थित हो सकती है, क्योंकि इसे नई घटनाओं द्वारा ओवरराइट किया गया था।
आप सभी फ़ाइल डिलीट इवेंट को SQL डेटाबेस में सहेज सकते हैं। आप अपने इवेंट्स को स्टोर करने के लिए Microsoft SQL Server, Elasticsearch, या MySQL/MariaDB डेटाबेस का उपयोग कर सकते हैं।
इस उदाहरण में, हम आपको दिखाएंगे कि MySQL पर एक अलग डेटाबेस टेबल पर ऑडिट इवेंट कैसे लॉग करें। मैं निम्न टेबल फॉर्मेट का उपयोग करूंगा:
- सर्वर नाम;
- हटाई गई फ़ाइल का नाम;
- दिनांक और समय;
- फ़ाइल को हटाने वाले उपयोगकर्ता का नाम।
इस टेबल को बनाने के लिए MySQL क्वेरी इस तरह दिखती है:
CREATE TABLE deleted_items (id INT NOT NULL AUTO_INCREMENT, server VARCHAR(100), file_name VARCHAR(255), dt_time DATETIME, user_name VARCHAR(100), PRIMARY KEY (ID));
नोट. PowerShell से MySQL डेटाबेस एक्सेस करने का एक उदाहरण पहले लेख Querying MySQL Database with PowerShell में माना गया था।
यदि आप Microsoft SQL Server डेटाबेस का उपयोग करना चाहते हैं, तो लेख "How to run a MSSQL Server Query from PowerShell?" देखें।
वर्तमान दिन के लिए Security लॉग से EventID 4663 वाले इवेंट प्राप्त करने के लिए, आप निम्न PowerShell स्क्रिप्ट का उपयोग कर सकते हैं:
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data[6]."#text"
$User = $event.Event.EventData.Data[1]."#text"
$Computer = $event.Event.System.computer
}
}

अगला PowerShell स्क्रिप्ट आपके द्वारा प्राप्त डेटा को रिमोट सर्वर (IP एड्रेस 10.1.1.13 के साथ) पर MySQL डेटाबेस में लिखेगा:
Add-Type –Path 'C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\Assemblies\v4.5\MySql.Data.dll'
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString='server=10.1.1.13;uid=posh;pwd=P@ssw0rd;database=aduser'}
$Connection.Open()
$sql = New-Object MySql.Data.MySqlClient.MySqlCommand
$sql.Connection = $Connection
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data[6]."#text"
$File = $File.Replace('\','|')
$User = $event.Event.EventData.Data[1]."#text"
$Computer = $event.Event.System.computer
$sql.CommandText = "INSERT INTO deleted_items (server,file_name,dt_time,user_name ) VALUES ('$Computer','$File','$Time','$User')"
$sql.ExecuteNonQuery()
}
}
$Reader.Close()
$Connection.Close()
इवेंट्स को एक्सटर्नल डेटाबेस में सहेजने के बाद, इस इवेंट लॉग को क्लियर किया जा सकता है।
अब, यह पता लगाने के लिए कि फ़ाइल "AnnualReport.DOC" किसने हटाई, PowerShell कंसोल में निम्न स्क्रिप्ट चलाना पर्याप्त है:
$DeletedFile = "%AnnualReport.DOC%"
Set-ExecutionPolicy RemoteSigned
Add-Type –Path 'C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\Assemblies\v4.5\MySql.Data.dll'
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString='server=10.1.1.13;uid=posh;pwd=P@ssw0rd;database=aduser'}
$Connection.Open()
$MYSQLCommand = New-Object MySql.Data.MySqlClient.MySqlCommand
$MYSQLDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter
$MYSQLDataSet = New-Object System.Data.DataSet
$MYSQLCommand.Connection=$Connection
$MYSQLCommand.CommandText="SELECT user_name,dt_time from deleted_items where file_name LIKE '$DeletedFile'"
$MYSQLDataAdapter.SelectCommand=$MYSQLCommand
$NumberOfDataSets=$MYSQLDataAdapter.Fill($MYSQLDataSet, "data")
foreach($DataSet in $MYSQLDataSet.tables[0])
{
write-host "User:" $DataSet.user_name "at:" $DataSet.dt_time
}
$Connection.Close()
अब आप PS कंसोल में यूजरनेम और फ़ाइल हटाए जाने का समय देख सकते हैं।

\" डेटाबेस में नहीं लिखा जाता है, हमने इसे "|" से बदल दिया है। इसलिए यदि आपको फ़ाइल का पूरा पथ प्रदर्शित करना है, तो आप डेटाबेस से चयन करते समय रिवर्स रिप्लेसमेंट कर सकते हैं:
$DataSet.file_name.Replace('|','\').
इवेंट लॉग से डेटाबेस में जानकारी लिखने की स्क्रिप्ट को दिन के अंत में टास्क शेड्यूलर का उपयोग करके चलाया जा सकता है या फ़ाइल डिलीशन EventID (On Event) से जोड़ा जा सकता है, जो अधिक संसाधन-खपत वाला है। यह सिस्टम की आवश्यकताओं पर निर्भर करता है।
सुझाव. सुनिश्चित करें कि आप Security इवेंट लॉग फ़ाइल का अधिकतम आकार दिन के सभी इवेंट लॉग करने के लिए पर्याप्त बड़ा सेट करते हैं। अन्यथा, आपको डेटाबेस में डेटा एक्सपोर्ट करने का कार्य दिन में एक बार से अधिक बार या ट्रिगर पर भी चलाना होगा। आमतौर पर, वर्कस्टेशन पर Maximum Log Size कम से कम 64 MB होना चाहिए, और Windows फ़ाइल सर्वर पर 262 MB। पुराने इवेंट को ओवरराइट करने का विकल्प सक्षम छोड़ देना चाहिए (Overwrite events as needed)।यदि आवश्यक हो, तो आप PHP वेब पेज बना सकते हैं जिससे फ़ाइलें हटाने वाले उपयोगकर्ताओं के बारे में जानकारी अधिक सुविधाजनक रूप में प्राप्त की जा सके।
महत्वपूर्ण सुझाव. यदि लॉग में एक एंट्री है कि फ़ाइल उपयोगकर्ता द्वारा हटाई गई थी, तो इसे जानबूझकर या दुर्भावनापूर्ण कार्रवाई के रूप में व्याख्या करने में जल्दबाजी न करें। कई प्रोग्राम (विशेष रूप से MS Office ऐप्स) परिवर्तनों को सहेजते समय एक अस्थायी फ़ाइल बनाते हैं और फिर फ़ाइल के पुराने संस्करण को हटा देते हैं। इस मामले में, प्रोसेस नाम (ProcessName फ़ील्ड) की लॉगिंग सक्षम करें, जिससे फ़ाइल हटाई गई थी, और आप इसके आधार पर फ़ाइल डिलीशन इवेंट्स को पार्स कर सकते हैं। या आप ऐसे प्रोसेस से इवेंट्स को फ़िल्टर कर सकते हैं, जैसे winword.exe, excel.exe, आदि।फ़ाइल डिलीट ऑडिट इवेंट को टेक्स्ट फ़ाइल में लॉग करना
यदि आप एक अलग डेटाबेस सर्वर का उपयोग नहीं करना चाहते हैं, तो आप फ़ाइल डिलीशन ऑडिट इवेंट को एक सादे टेक्स्ट लॉग फ़ाइल में सहेज सकते हैं। अपने आउटपुट को टेक्स्ट फ़ाइल में सहेजने के लिए इस PowerShell स्क्रिप्ट का उपयोग करें:
$Outfile = "C:\Logs\Deleted-file-history-log.txt"
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data[6]."#text"
$User = $event.Event.EventData.Data[1]."#text"
$strLog = $Computer + " " + $File + " " + $Time + " " + $User
$strLog | out-file $Outfile –append
}
}

तो, हमने शेयर्ड नेटवर्क फ़ोल्डर में हटाई गई फ़ाइलों के बारे में जानकारी को ऑडिट और स्टोर करने के लिए सिस्टम का विचार और सामान्य मॉडल सुझाया है। यदि आवश्यक हो, तो इसे आसानी से आपकी आवश्यकताओं को पूरा करने के लिए संशोधित किया जा सकता है।