
PowerShell SharePoint निष्कर्षण + ऑडिटिंग टूल रेड/ब्लू/पर्पल टीमों के लिए। Microsoft Graph के माध्यम से एक उपयोगकर्ता द्वारा एक्सेस किए जा सकने वाले सभी SharePoint साइटों/ड्राइवों की गणना करता है, फ़ाइलों को पुनरावर्ती रूप से डाउनलोड करता है, और SIEM सहसंबंध, डिटेक्शन इंजीनियरिंग और IR परीक्षण के लिए प्रत्येक Graph + SharePoint HTTP अनुरोध को लॉग करता है।
SharePointDumper एक PowerShell-आधारित निष्कर्षण और ऑडिटिंग उपयोगिता है जो Microsoft Graph के माध्यम से उन SharePoint साइटों की गणना करती है जिन तक उपयोगकर्ता पहुँच सकता है और SharePoint के माध्यम से फ़ाइलें डाउनलोड करती है।
यह SOC / DLP परीक्षण, पर्पल टीमिंग, और गैर-परिष्कृत रेड-टीम मूल्यांकन के लिए डिज़ाइन किया गया है, इसलिए यह डाउनलोड की गई फ़ाइलों और SIEM सहसंबंध के लिए प्रत्येक HTTP अनुरोध (Graph + SharePoint) सहित विस्तृत रिपोर्ट तैयार करता है।
यह टूल प्रमाणीकरण नहीं करता है। इसके बजाय, इसे उपयुक्त Microsoft Graph अनुमतियों (Sites.Read.All या Sites.ReadWrite.All) के साथ पहले से प्राप्त OAuth2 एक्सेस टोकन की आवश्यकता होती है।
यदि ऐसा टोकन प्राप्त करने में सहायता चाहिए, तो आप EntraTokenAid का उपयोग कर सकते हैं (नीचे उदाहरण शामिल हैं), जो उपयोग योग्य एक्सेस टोकन उत्पन्न करना सरल बनाता है।
निष्पादन:

उदाहरण CSV API लॉग (CSV या JSON हो सकता है):

उदाहरण फ़ाइल डाउनलोड लॉग (CSV या JSON हो सकता है)

git clone https://github.com/zh54321/SharePointDumper.git
cd SharePointDumper
SharePointDumper को साइटों और फ़ाइलों की गणना करने के लिए प्रतिनिधि अनुमतियों के साथ एक वैध Microsoft Graph एक्सेस टोकन की आवश्यकता होती है:
Sites.Read.All याSites.ReadWrite.Allइसके अलावा, OAuth क्लाइंट को SharePoint API को कॉल करने की अनुमति होनी चाहिए।
23 से अधिक Microsoft प्रथम-पक्ष एप्लिकेशन पहले से ही Sites.Read… अनुमतियों के लिए पूर्व-सहमत हैं। वे SharePoint से फ़ाइलें डाउनलोड कर सकते हैं, और अतिरिक्त टेनेंट कॉन्फ़िगरेशन के बिना एक वैध टोकन प्राप्त करने के लिए उपयोग किए जा सकते हैं।
यदि संभव हो, तो CAE-सक्षम एक्सेस टोकन का उपयोग करें, जो 24 घंटे तक वैध रहता है और लंबे समय तक चलने वाले डंप के दौरान रुकावटों को कम करता है।
आप उपयुक्त एक्सेस टोकन प्राप्त करने के लिए EntraTokenAid का उपयोग PowerShell के माध्यम से कर सकते हैं
(डिफ़ॉल्ट रूप से CAE टोकन का अनुरोध किया जाता है):
# मॉड्यूल क्लोन करें
git clone https://github.com/zh54321/EntraTokenAid.git
Import-Module EntraTokenAid/EntraTokenAid.psm1
# टोकन प्राप्त करें
$tokens = Invoke-Auth -ClientID 'b26aadf8-566f-4478-926f-589f601d9c74' -RedirectUrl 'urn:ietf:wg:oauth:2.0:oob'
# वैकल्पिक: नीचे दिए गए उदाहरणों के साथ संगत वेरिएबल में स्टोर करें
$AccessToken = $tokens.access_token
.\Invoke-SharePointDumper.ps1 -AccessToken $accesstoken -UserAgent "Not SharePointDumper"
.\Invoke-SharePointDumper.ps1 -AccessToken $accesstoken -IncludeSites "Finance","Projects"
.\Invoke-SharePointDumper.ps1 -AccessToken $accesstoken -ExcludeSites "HR","Legal"
.\Invoke-SharePointDumper.ps1 -AccessToken $accesstoken -IncludeExtensions pdf,docx
.\Invoke-SharePointDumper.ps1 -AccessToken $accesstoken -ExcludeExtensions jpg,bmp
.\Invoke-SharePointDumper.ps1 -AccessToken $accesstoken -MaxFiles 500
.\Invoke-SharePointDumper.ps1 -AccessToken $accesstoken -MaxTotalSizeMB 100
.\Invoke-SharePointDumper.ps1 -AccessToken $accesstoken -RequestDelaySeconds 2
जिटर के साथ:
.\Invoke-SharePointDumper.ps1 -AccessToken $accesstoken -RequestDelaySeconds 2 -Variation 3
.\Invoke-SharePointDumper.ps1 -AccessToken $accesstoken -Resume -OutputFolder .\20251121_1551_MyTenant
रिज़्यूम मोड में, -OutputFolder को आपके पिछले रन के फ़ोल्डर की ओर इशारा करना चाहिए।
SharePointDumper एक रीफ़्रेश टोकन और EntraTokenAid का उपयोग करके समाप्त हुए एक्सेस टोकन (HTTP 401) को स्वचालित रूप से रीफ़्रेश कर सकता है।
# अनिवार्य: मॉड्यूल आयात किया जाना चाहिए ताकि टूल Invoke-Refresh कमांड का उपयोग कर सके
Import-Module .\EntraTokenAid\EntraTokenAid.psm1
# वैकल्पिक: EntraTokenAid का उपयोग करके टोकन प्राप्त करें (अन्य विधियाँ भी संभव हैं)
$tokens = Invoke-Auth -ClientId 'b26aadf8-566f-4478-926f-589f601d9c74' -RedirectUrl 'urn:ietf:wg:oauth:2.0:oob'
# रीफ़्रेश समर्थन के साथ SharePointDumper चलाएँ
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -RefreshToken $tokens.refresh_token -RefreshClientId 'b26aadf8-566f-4478-926f-589f601d9c74'
नोट: टोकन रीफ़्रेश प्रयास API लॉग में लॉग नहीं किए जाते हैं।
20261115_MySecureTenant/
├── SharePointDumper_Report_20261115_080333.txt
├── SharePointDumper_ApiLog_20261115_080333.csv
├── SharePointDumper_FileLog_20261115_080333.csv
├── Site A/
│ └── Documents/
│ ├── file1.docx
│ └── file2.pdf
└── Site B/
└── Site Assets/
Report_*.txt)ApiLog_*.csv या .json)SharePointDumper_ReportResume_*SharePointDumper_ApiLogResume_*एक्सेस टोकन अमान्य या समाप्त हो गया है।
एक्सेस टोकन मान्य है, लेकिन आवश्यक Microsoft Graph या SharePoint अनुमतियाँ गायब हैं।
SharePointDumper गतिविधियाँ इसमें लॉग की जाती हैं:
/organization, /sites, /drives) को रिकॉर्ड करता है।UAL उदाहरण:

Graph Activity Log उदाहरण:

MIT License के तहत जारी किया गया।
| ऐप नाम | क्लाइंट आईडी | FOCI | EntraTokenAid प्रमाणीकरण कमांड |
|---|
| Microsoft Teams | 1fec8e78-bce4-4aaf-ab1b-5451cc387264 | TRUE | $tokens = Invoke-Auth -ClientID '1fec8e78-bce4-4aaf-ab1b-5451cc387264' -RedirectUrl 'https://login.microsoftonline.com/common/oauth2/nativeclient' |
| Outlook Mobile | 27922004-5251-4030-b22d-91ecd9a37ea4 | TRUE | $tokens = Invoke-Auth -ClientID '27922004-5251-4030-b22d-91ecd9a37ea4' -RedirectUrl 'x-msauth-outlook-prod://com.microsoft.Office.Outlook' |
| OneDrive SyncEngine | ab9b8c07-8f02-4f72-87fa-80105867a763 | TRUE | $tokens = Invoke-Auth -ClientID 'ab9b8c07-8f02-4f72-87fa-80105867a763' -RedirectUrl 'https://login.microsoftonline.com/common/oauth2/nativeclient' |
| OneDrive iOS App | af124e86-4e96-495a-b70a-90f90ab96707 | TRUE | $tokens = Invoke-Auth -ClientID 'af124e86-4e96-495a-b70a-90f90ab96707' -RedirectUrl 'ms-onedrive-auth://com.microsoft.skydrive.shareextension' |
| Microsoft Bing Search | cf36b471-5b44-428c-9ce7-313bf84528de | TRUE | $tokens = Invoke-Auth -ClientID 'cf36b471-5b44-428c-9ce7-313bf84528de' -RedirectUrl 'msauth.com.microsoft.bing://auth' |
| OneDrive | b26aadf8-566f-4478-926f-589f601d9c74 | TRUE | $tokens = Invoke-Auth -ClientID 'b26aadf8-566f-4478-926f-589f601d9c74' -RedirectUrl 'urn:ietf:wg:oauth:2.0:oob' |
| SharePoint | d326c1ce-6cc6-4de2-bebc-4591e5e13ef0 | TRUE | $tokens = Invoke-Auth -ClientID 'd326c1ce-6cc6-4de2-bebc-4591e5e13ef0' -RedirectUrl 'msauth://code/ms-sharepoint-auth%3A%2F%2Fcom.microsoft.sharepoint' |
| SharePoint Android | f05ff7c9-f75a-4acd-a3b5-f4b6a870245d | TRUE | $tokens = Invoke-Auth -ClientID 'f05ff7c9-f75a-4acd-a3b5-f4b6a870245d' -RedirectUrl 'msauth://com.microsoft.sharepoint/gSoqzhbCjkyvI%2Fl7kC7IdG7KbPU%3D' |
| OfficeHome | 4765445b-32c6-49b0-83e6-1d93765276ca | FALSE | $tokens = Invoke-Auth -ClientID '4765445b-32c6-49b0-83e6-1d93765276ca' -RedirectUrl 'https://scuprodprv.www.microsoft365.com/spalanding' -Origin 'https://doesnotmatter' |
| SharePoint Online Web Client Extensibility | 08e18876-6177-487e-b8b5-cf950c1e598c | FALSE | $tokens = Invoke-Auth -ClientID '08e18876-6177-487e-b8b5-cf950c1e598c' -RedirectUrl 'https://onedrive.cloud.microsoft/_forms/spfxsinglesignon.aspx' -Origin 'https://doesnotmatter' |
| Microsoft Teams Web Client | 5e3ce6c0-2b1f-4285-8d4b-75ee78787346 | FALSE | $tokens = Invoke-Auth -ClientID '5e3ce6c0-2b1f-4285-8d4b-75ee78787346' -RedirectUrl 'https://teams.cloud.microsoft/convene/townhall' -Origin 'https://doesnotmatter' |
| Portfolios | f53895d3-095d-408f-8e93-8f94b391404e | FALSE | $tokens = Invoke-Auth -ClientID 'f53895d3-095d-408f-8e93-8f94b391404e' -RedirectUrl 'https://project.microsoft.com/msal-redirect2' -Origin 'https://doesnotmatter' |
| Microsoft Remote Assist | fca5a20d-55aa-4395-9c2f-c6147f3c9ffa | FALSE | $tokens = Invoke-Auth -ClientID 'fca5a20d-55aa-4395-9c2f-c6147f3c9ffa' -RedirectUrl 'http://localhost:13824' |
| ProcessSimpleGCC | 38a893b6-d74c-4786-8fe7-bc3b4318e881 | FALSE | $tokens = Invoke-Auth -ClientID '38a893b6-d74c-4786-8fe7-bc3b4318e881' -RedirectUrl 'https://make.gov.powerautomate.us/auth-redirect.html' -Origin 'https://doesnotmatter' |
| WindowsShareExperienceProd | a8759234-4b8b-4d94-8c0a-ee1ab73af270 | FALSE | $tokens = Invoke-Auth -ClientID 'a8759234-4b8b-4d94-8c0a-ee1ab73af270' -RedirectUrl 'ms-appx-web://Microsoft.AAD.BrokerPlugin/a8759234-4b8b-4d94-8c0a-ee1ab73af270' |
| Office voice transcript generator AAD | d2eb9fef-f34c-40ec-b6a3-4bf524065158 | FALSE | $tokens = Invoke-Auth -ClientID 'd2eb9fef-f34c-40ec-b6a3-4bf524065158' -RedirectUrl 'msauth.com.microsoft.Office.TestVoice.TestVoice2://auth' |
| Azure OpenAI Studio | dc807dec-d211-4b3f-bc8a-43b3443c4874 | FALSE | $tokens = Invoke-Auth -ClientID 'dc807dec-d211-4b3f-bc8a-43b3443c4874' -RedirectUrl 'https://dev.oai.azure.com' -Origin 'https://doesnotmatter' |
| Azure AI Studio App | cb2ff863-7f30-4ced-ab89-a00194bcf6d9 | FALSE | $tokens = Invoke-Auth -ClientID 'cb2ff863-7f30-4ced-ab89-a00194bcf6d9' -RedirectUrl 'https://int.ai.azure.com/agents' -Origin 'https://doesnotmatter' |
| Azure Machine Learning Workbench Web App | d7304df8-741f-47d3-9bc2-df0e24e2071f | FALSE | $tokens = Invoke-Auth -ClientID 'd7304df8-741f-47d3-9bc2-df0e24e2071f' -RedirectUrl 'https://dev.ml.azure.com/redirect' -Origin 'https://doesnotmatter' |
| M365ChatClient | c0ab8ce9-e9a0-42e7-b064-33d422df41f1 | FALSE | $tokens = Invoke-Auth -ClientID 'c0ab8ce9-e9a0-42e7-b064-33d422df41f1' -RedirectUrl 'https://fa000000128.resources.office.net/f7024bdc-7caf-4ca8-807d-2908f09640d6/1.0.2412.19011/en-us_web/login.html' -Origin 'https://doesnotmatter' |
| Microsoft Loop App | a187e399-0c36-4b98-8f04-1edc167a0996 | FALSE | $tokens = Invoke-Auth -ClientID 'a187e399-0c36-4b98-8f04-1edc167a0996' -RedirectUrl 'https://hosted.loop.cloud.dev.microsoft/authLanding.html' -Origin 'https://doesnotmatter' |
| Viva Goals | c8423563-e8f6-49f2-924b-90d9f664378a | FALSE | $tokens = Invoke-Auth -ClientID 'c8423563-e8f6-49f2-924b-90d9f664378a' -RedirectUrl 'https://goals-ppe.microsoft.com/aad/consume' -Origin 'https://doesnotmatter' |
| Microsoft Mesh | eea619ad-603a-4b03-a386-860fcc7410d1 | FALSE | $tokens = Invoke-Auth -ClientID 'eea619ad-603a-4b03-a386-860fcc7410d1' -RedirectUrl 'http://localhost:13824' |
| पैरामीटर | आवश्यक | प्रकार | विवरण |
|---|
AccessToken | हाँ | String | OAuth2 एक्सेस टोकन। टूल के अंदर कोई प्रमाणीकरण नहीं किया गया। |
OutputFolder | नहीं | String | डंप के लिए निर्देशिका। डिफ़ॉल्ट: "."। -Resume मोड में, मौजूदा पिछले डंप फ़ोल्डर की ओर इशारा करना चाहिए। |
UserAgent | नहीं | String | सभी HTTP अनुरोधों के लिए कस्टम UserAgent। डिफ़ॉल्ट: SharePointDumper |
Proxy | नहीं | String | वैकल्पिक HTTP प्रॉक्सी (जैसे, http://127.0.0.1:8080). |
IncludeExtensions | नहीं | String[] | केवल ये एक्सटेंशन डाउनलोड करें। |
ExcludeExtensions | नहीं | String[] | इन एक्सटेंशनों को छोड़ें (IncludeExtensions का उपयोग करने पर अनदेखा किया जाता है)। |
IncludeSites | नहीं | String[] | केवल इनमें से किसी भी मान से मेल खाने वाली साइटों को संसाधित करें। |
ExcludeSites | नहीं | String[] | इनमें से किसी भी मान से मेल खाने वाली साइटों को छोड़ें। |
DisableIpLookup | नहीं | Switch | सार्वजनिक IP के लिए ifconfig.me क्वेरी न करें। |
RequestDelaySeconds | नहीं | Double | प्रत्येक HTTP अनुरोध से पहले आधार विलंब। |
Variation | नहीं | Double | आधार विलंब में जोड़ा गया यादृच्छिक जिटर। |
MaxFiles | नहीं | Int | डाउनलोड करने के लिए फ़ाइलों की अधिकतम संख्या। डिफ़ॉल्ट: कोई सीमा नहीं। |
MaxTotalSizeMB | नहीं | Double | अधिकतम कुल डाउनलोड आकार। डिफ़ॉल्ट: कोई सीमा नहीं। |
Resume | नहीं | Switch | पहले से डाउनलोड की गई फ़ाइलों को छोड़ देता है। -OutputFolder की आवश्यकता है। |
ApiLogFormat | नहीं | String | Csv (डिफ़ॉल्ट), Json, या None। |
ApiLogPath | नहीं | String | API लॉग फ़ाइल के लिए कस्टम आउटपुट पथ। |
FileLogFormat | नहीं | String | Csv (डिफ़ॉल्ट), Json, या None। |
FileLogPath | नहीं | String | फ़ाइल लॉग फ़ाइल के लिए कस्टम आउटपुट पथ। |
LogDownloadTokens | नहीं | Switch | पूर्ण SharePoint डाउनलोड URL सहित tempauth टोकन लॉग करें (असुरक्षित)। डिफ़ॉल्ट: टोकन रिडैक्ट किए जाते हैं। |
RefreshToken | नहीं | String | HTTP 401 पर स्वचालित एक्सेस टोकन नवीनीकरण के लिए उपयोग किया जाने वाला OAuth2 रीफ़्रेश टोकन। |
RefreshClientId | नहीं | String | -RefreshToken के साथ उपयोग किया जाने वाला क्लाइंट आईडी। |
RefreshTenant | नहीं | String | रीफ़्रेश एंडपॉइंट के लिए टेनेंट प्राधिकरण (डिफ़ॉल्ट: common)। |