ค้นหาเว็บไซต์

เพิ่ม-ลบ-รับตัวรับเหตุการณ์ใน SharePoint ด้วย PowerShell


โดยปกติแล้วเราจะใช้แอปพลิเคชันคอนโซล C# หรือรหัสเปิดใช้งานคุณลักษณะเพื่อลงทะเบียนตัวรับเหตุการณ์กับรายการเป้าหมายหรือไลบรารีใน SharePoint ในบางครั้ง เราอาจต้องจัดการกับการเชื่อมโยงตัวรับเหตุการณ์อย่างชัดเจน แน่นอนว่ายังมีเครื่องมือที่ยอดเยี่ยม (เช่น SharePoint Event Receiver Manager) ในการจัดการตัวรับเหตุการณ์ อย่างไรก็ตาม ในสภาพแวดล้อมการใช้งานจริงซึ่งไม่อนุญาตให้ฉันใช้เครื่องมือดังกล่าวด้วยเหตุผลด้านความปลอดภัย ฉันเหลือตัวเลือก: PowerShell ดังนั้น ฉันจึงแชร์ข้อมูลโค้ด PowerShell ของฉันเพื่อจัดการตัวรับเหตุการณ์ใน SharePoint โดยใช้ PowerShell

รับตัวรับเหตุการณ์ทั้งหมดที่แนบมากับรายการ:

เรามาค้นหากันใน SharePoint 2010 PowerShell เพื่อรับตัวรับเหตุการณ์ที่เกี่ยวข้องกับรายการเฉพาะ


 Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

 #Get the web
 $Web = Get-SPWeb "https://sharepoint.crescent.com"

 #Get the Target List
 $List = $Web.Lists["Documents"]

 #Retrieve all event receivers associated with the list
 $List.EventReceivers | Select Id, Type, Assembly, Class | FL 

ค้นหาตัวรับเหตุการณ์ทั้งหมดบนเว็บไซต์ทั้งหมดในเว็บแอปพลิเคชัน:

ในทำนองเดียวกัน เราสามารถดึงข้อมูลตัวรับเหตุการณ์ทั้งหมดที่เกี่ยวข้องกับรายการและไลบรารีต่างๆ ทั่วทั้งไซต์คอลเลกชันทั้งหมดได้โดยใช้สคริปต์ PowerShell ด้านล่าง


Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

$WebAppURL = "https://sharepoint.crescent.com"

 #Get All Webs
 $Webs = Get-SPWebApplication $WebAppURL | Get-SPSite -Limit All | Get-SPWeb 
 
foreach($web in $Webs)
{
    #Get Lists with Event receivers excluding System lists
    $web.lists | where { ($_.Author.LoginName -ne "SHAREPOINT\system") -and ($_.Hidden -eq $false) -and ($_.IsCatalog -eq $false) -and ($_.IsSiteAssetsLibrary -eq $false) -and ($_.EventReceivers.count -gt 0) } | Select Title, EventReceivers | FL
} 

PowerShell นี้ตรวจสอบตัวรับเหตุการณ์รายการใน SharePoint

SharePoint PowerShell เพื่อเพิ่มตัวรับเหตุการณ์ลงในรายการ

โดยปกติแล้ว เราจะสร้างแอปพลิเคชันคอนโซล C#.net เพื่อเชื่อมโยงตัวรับเหตุการณ์กับรายการใดรายการหนึ่ง ครั้งนี้ ฉันลองใช้สคริปต์ PowerShell: มาปรับใช้ตัวรับเหตุการณ์ใน SharePoint 2013 โดยใช้ PowerShell กันดีกว่า

มาเพิ่มตัวรับเหตุการณ์โดยสร้างคำจำกัดความใน PowerShell:


#Get the web
$Web = Get-SPWeb "https://sharepoint.crescent.com"

#Get the Target List
$List = $Web.Lists["Documents"]

#Add new event receiver definition
$def = $list.EventReceivers.Add()
$def.Assembly = "Crescent.DocRestrict, Version=1.0.0.0, Culture=neutral, PublicKeyToken=677b45b1314c252c"
$def.Class = "Crescent.Utilities.DocRestrict.Restrict" 
$def.Type = [Microsoft.SharePoint.SPEventReceiverType]::ItemAdded
$def.Name = "ItemAdded Event Receiver";
$def.SequenceNumber = 3000
$def.Synchronization = [Microsoft.SharePoint.SPEventReceiverSynchronization]::Synchronous
$def.Update() 

SharePoint เพิ่มตัวรับเหตุการณ์ด้วย PowerShell

อีกทางหนึ่ง ใน SharePoint เพื่อเพิ่มตัวรับเหตุการณ์ลงในรายการด้วย PowerShell:


Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

#Get the web
$Web = Get-SPWeb "https://sharepoint.crescent.com"

#Get the Target List
$List = $Web.Lists["Documents"]

#Retrieve all event receivers associated with the list
#$List.EventReceivers | Select Id, Type, Assembly, Class | FL

$Assembly = "Crescent.DocRestrict, Version=1.0.0.0, Culture=neutral, PublicKeyToken=677b45b1314c252c"
$Class= "Crescent.Utilities.DocRestrict.Restrict"
Write-Host "Attaching Event Receiver..."
# sharepoint 2010 powershell register event receiver
$list.EventReceivers.Add("ItemAdding", $Assembly , $Class)

แล้วประเภทเนื้อหาล่ะ? สามารถเพิ่มตัวรับเหตุการณ์โดยใช้ PowerShell ได้หรือไม่ ทำไมจะไม่ล่ะ?


#Get the content type
$ctype = $web.ContentTypes["content type name"]
#Add event receiver
$ctype.EventReceivers.Add("ItemAdding", "Assembly Name", "Class")

ตัวรับเหตุการณ์ SharePoint ลบด้วย PowerShell:

หากต้องการลบตัวรับเหตุการณ์โดยใช้ PowerShell ใน SharePoint นี่คือรหัส:


Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

#Get the web
$Web = Get-SPWeb "https://sharepoint.crescent.com"

#Get the Target List
$List = $Web.Lists["Documents"]

$Assembly = "Crescent.DocRestrict, Version=1.0.0.0, Culture=neutral, PublicKeyToken=677b45b1314c252c"

$EventReceivers = $list.EventReceivers | Where {$_.Assembly -eq $assembly}

if ($EventReceivers) #.Count -gt 0)
{
    foreach($Receiver in $EventReceivers)
    { 
         Write-Host "Deleting Event Receiver from " $list.RootFolder.ServerRelativeUrl 

         $Receiver.Delete()
    }
} 

SharePoint PowerShell เพื่อลบตัวรับเหตุการณ์:

คุณยังสามารถลบตัวรับเหตุการณ์เฉพาะได้ด้วย ID ของมัน นี่คือตัวอย่างของการลบตัวรับเหตุการณ์ออกจากรายการ SharePoint โดยใช้ PowerShell


#Get the web
$Web = Get-SPWeb "https://sharepoint.crescent.com"

#Get the Target List
$List = $Web.Lists["Documents"]

#Get all event receivers associated with the list
$List.EventReceivers | Select Id, Type, Assembly, Class | FL 

#$EventReceiverID = "625c59a9-72d7-4479-a1e7-35f040e4f9a1"
#Uncomment below line to sharepoint 2010 remove event receiver from list powershell
#$list.EventReceivers[[GUID]$EventReceiverID].delete()

ลบตัวรับเหตุการณ์ที่ซ้ำกัน:

อินสแตนซ์ที่ซ้ำกันของตัวรับเหตุการณ์ SharePoint เป็นปัญหาที่ทราบ พวกมันใช้ส่วนประกอบร่วมกันโดยมีหมายเลขลำดับต่างกัน ดังนั้นพวกเขาจึงยิงสองครั้ง


Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

#Get the web
$Web = Get-SPWeb "https://sharepoint.crescent.com"

#Get the Target List
$List = $Web.Lists["Documents"]

#Get all event receivers grouped by assembly/class/type
$list.EventReceivers | Group-object assembly, class, type |  where { $_.Count -gt 1 } 

#If any of the assembly/class/type pairs are same, we have a duplicate!

#Leave the first event receiver at 0th position and delete all other
$list.EventReceivers | Group-object assembly, class, type |  where { $_.Count -gt 1 } |  foreach { $_.Group[1..50] } | foreach { $_.Delete() }

หากต้องการเพิ่มตัวรับเหตุการณ์ด้วยรายการ SharePoint โดยทางโปรแกรมด้วย C# โปรดดูที่: SharePoint เพิ่มตัวรับเหตุการณ์ลงในรายการ

บทความที่เกี่ยวข้อง