分配脚本-删除

注意:  我们希望能够尽快以你的语言为你提供最新的帮助内容。 本页面是自动翻译的,可能包含语法错误或不准确之处。我们的目的是使此内容能对你有所帮助。可以在本页面底部告诉我们此信息是否对你有帮助吗? 请在此处查看本文的 英文版本 以便参考。

附加的删除-EDU 分配、 导出-EDU 分配和获取-用户类别是 power shell 脚本。

删除-EDU 工作分配

< #
   .概要
    删除 Edu 分配数据中的一组类 csv 文件中指定用户。
    .说明
    脚本从输入的 csv 文件中读取用户的课程详细信息。获取分配和提交的每个工作分配,然后删除提交它还生成报表 file(DeleteAssignmentsReport.csv) 呼叫信息的额外信息。完成提交删除它将更新为 true 的特定类 DeleteSubmissionsProcessed 列。如果脚本失败之间我们可以重新运行该脚本使用相同的输入文件,因为该文件将更新为提交的最后一个删除。
   .示例
    .\Delete-EduAssignments.ps1 userClassDetailsFile < 用户类详细信息 csv 文件的完整路径 >
    这将删除所有提交,但无法从类删除的用户信息
    .\Delete-EduAssignments.ps1-userClassDetailsFile < 用户类详细信息 csv 文件的完整路径 > removeMemberFromClass
    这将删除所有提交并删除的用户信息从课程
   .参数 userClassDetailsFile
   这是 csv file(userClassDetails.csv),这是获取 UserClasses.ps1 脚本的输出。此文件有用户类别和删除和获取提交处理是否信息。此值应为完整路径 file(drive:\GDPR\userClassDetails.csv)
   .切换参数 removeMemberFromClass
   我们使用此参数时从每个课程,它将删除的用户信息
   .笔记
   我们需要 Microsoft.IdentityModel.Clients.ActiveDirectory.dll 并且需要 Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms.dll
#>
参数 (
    [parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [ValidateScript ({
        如果 (-不 ($_ |Test-Path)) {
            拒绝"userClassDetailsFile 不存在。"
        }
        如果 (-不 ($_ |Test-Path-PathType 叶级)) {
            拒绝"userClassDetailsFile 参数必须是文件。文件夹路径不允许。"
        }
        如果 ($_-notmatch"(\.csv)") {
            拒绝"userClassDetailsFile 应是一个逗号分隔的文件,使用获取 UserClasses.ps1 生成"
        }
        返回 $true
    })]
    字符串 $userClassDetailsFile,

[parameter(Mandatory=$false)]
    切换 $removeMemberFromClass
)
# 加载 ADAL
添加类型-路径".\ADAL\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
$educationEndpoint ="https://graph.microsoft.com/beta/education/"
$script: userClassDetails = @ ()
$script: deleteAssignmentsReport = @ ()
$script: maxRetryAttempt = 3
$script: authHeaders = $null
$script: authenticationResult = $null
$graphEndpoint ="https://graph.microsoft.com"
$authString ="https://login.windows.net/common"

#Get authheaders
函数获取 AuthHeaders
{
    参数 (
        [Parameter(Mandatory=$false)]
        布尔 $useRefreshToken = $false
    )
    $clientId ="eb2298a1-a6bb-4f16-a27a-b582815db47b"
    $redirectURI = 新建对象 System.Uri("urn:ietf:wg:oauth:2.0:oob")
    $promptBehavior = [Microsoft.IdentityModel.Clients.ActiveDirectory.PromptBehavior]::Always
    $authContext = 新建对象"Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext"-参数列表 $authString
    如果 ($useRefreshToken eq $false)
    {
        $script: authenticationResult = $authContext.AcquireToken $graphEndpoint、 $clientID、 $redirectURI ($promptBehavior)
    }
    其他
    {
        $script: authenticationResult = $authContext.AcquireTokenByRefreshToken ($script:authenticationResult.RefreshToken、 $clientId)
    }
    $authHeader = $script:authenticationResult.AccessTokenType +""+ $script:authenticationResult.AccessToken
    $headers = @{"授权"= $authHeader;"内容类型"="应用程序/json"}
    返回 $headers
}

#Retry 逻辑和脚本错误的日志记录
函数调用 RequestWithRetry
{
    参数 (
        Parameter(Mandatory=$true) $url,
        [Parameter(Mandatory=$true)][ValidateSet (Get,删除 ignorecase = $true)] $httpmethod,
        Parameter(Mandatory=$false) $classId,
        Parameter(Mandatory=$false) $className,
        Parameter(Mandatory=$true) $OperationName
    )

对于 ($i = 1; $i-le $script: maxRetryAttempt; $i + +)
    {
        请尝试
        {
            $APIResult = 调用 WebRequest-方法 $httpmethod Uri $url-页眉 $script: authHeaders
            $resultCount = 0
            如果 ($OperationName eq"GetAssignments")
            {
                $valueStartIndex = ($APIResult.content.indexof('"value":') + 8)
                $valueEndIndex = $APIResult.content.Length
                $valueString = $APIResult.content.substring ($valueStartIndex,$valueEndIndex $valueStartIndex-1)
                $resultCount = (($valuestring | 选择字符串"classId":-AllMatches)。Matches.Count)
            }
            其他
            {
                $submissionsJson = $APIResult.content |ConvertFrom Json
                $resultCount = $submissionsJson.value.count
            }

$script: deleteAssignmentsReport + = [PSCustomObject] @{
                RequestUrl = $url
                方法 = $httpmethod
                ResponseCode = $APIResult.StatusCode
                类名 = $className
                ClassId = $classId
                了申请 Id = ["请求 id"] $APIResult.Headers
                StatusDescription = $APIResult.StatusDescription
                NumberOfAttempts = $i
                操作名称 = $OperationName
                ResultCount = $resultCount
            }
            返回 $APIResult
        }
        捕获
        {
            if($_.Exception.Response 新 $null)
            {
                $responseCode = $_。Exception.Response.StatusCode.Value__
                $requestId = $_。Exception.Response.Headers ["请求 id"]
            }

            $script: deleteAssignmentsReport + = [PSCustomObject] @{
                RequestUrl = $url
                方法 = $httpmethod
                ResponseCode = $responseCode
                类名 = $className
                ClassId = $classId
                了申请 Id = $requestId
                StatusDescription = $_。Exception.Message
                NumberOfAttempts = $i
                操作名称 = $OperationName
                ResultCount = $resultCount
            }            

如果 ($i eq $script: maxRetryAttempt)
            {
                拒绝 $_
            }

如果 ($responseCode eq 401)
            {
                $script: authHeaders = 获取 AuthHeaders useRefreshToken $true
            }
        }
    }
}

从课程 #Remove 成员
函数删除 MemberFromClass
{
    参数 (
        Parameter(Mandatory=$true) $classDetails
    )

$removeMemberUrl ="{0}/v1.0/groups/{1}/members/{2}/'$ref"f $graphEndpoint、 $($classDetails.ClassId)、 $($classDetails.UserId)
    请尝试
    {
        调用 RequestWithRetry-url $removeMemberUrl-httpmethod 删除-classId $($classDetails.ClassId)-类名 $($classDetails.ClassName)-操作名称"RemoveMemberfromClass"|传出 Null
    }
    捕获
    {
        拒绝 $_
    }

}    

函数删除分配
{
    参数 (
        Parameter(Mandatory=$true) $classDetail
    )

请尝试
    {
        $classId = $classDetail.ClassId
        $className = $classDetail.ClassName
        $userId = $classDetail.UserId
        $role = $classDetail.Role
        $getAssignmentsUri = ("{0} / classes('{1}')/assignments?TargetUserId = {2} & UserClassRole = {3}"-f $educationEndpoint,$classId,$userId,$role)
        $assignments = $null
        $assignments = 调用 RequestWithRetry-url $getAssignmentsUri httpmethod 获取-classId $classId 类名 $className-操作名称"GetAssignments"
        如果 ($assignments 新 $null-和 $assignments.content 新 $null-和 $role eq"学生"))
        {
            $assignmentsCount = ((($assignments.content) |ConvertFrom-Json) 值).count
            编写主机"Retrieved $assignmentsCount 分配 $className 类"
            $assignmentsTracker = 0
            foreach (在 $assignment (($assignments.content) |ConvertFrom-Json) 值)
            {
                $assignmentName = $assignment.displayName
                $assignmentId = $assignment.id
                $submissions = $assignment.submissions
                编写主机"的 $($assignmentName) 的删除提交"
                $submissionsTracker = 0
                foreach (在 $submissions $submission)
                {
                    $deleteSDSSubmissionUri ="{0} / beta/教育/类//assignments/ {1} {2} /submissions/ {3} ?TargetUserId = {4} & UserClassRole = 学生"-f $graphEndpoint,$classId、 $assignmentId、 $($submission.id)、 $userId
                    如果 (($submissionsTracker eq ($submissions。长度-1))-和 ($assignmentsTracker eq ($assignmentsCount-1))-($removeMemberFromClass.IsPresent) 和)
                    {
                        编写主机"删除提交和用户的 classinfo"
                        $deleteSDSSubmissionUri = $deleteSDSSubmissionUri +"& CleanupUserClassData = true"
                    }
                    $deleteResponse = 调用 RequestWithRetry-url $deleteSDSSubmissionUri httpmethod 删除-classId $classId 类名 $className-操作名称"DeleteSubmission"
                    如果 ($deleteResponse 新 $null-和 $deleteResponse.Content.Length 新 0-和 $submissionsTracker eq ($submissions。长度-1))
                    {
                        $classDetail.DeleteSubmissionsProcessed ="true"
                        $script: userClassDetails |导出 Csv-路径 $($directoryPathOfFile) NoTypeInformation-强制
                    }
                    $submissionsTracker + +
                }
                $assignmentsTracker + +
            }
        }
    }
    捕获
    {   
        拒绝 $_
    }
}

$directoryPathOfFile = (获取项目-路径 $($userClassDetailsFile))。全名
$script: authHeaders = 获取 AuthHeaders
$script: userClassDetails = 导入 csv $userClassDetailsFile

$progressTracker = 0;
foreach (在 $script $classDetail: userClassDetails)
{
    编写进度-活动"删除用户的工作分配"-状态"处理类: $classDetail.classId"的完成百分比 ($progressTracker/$script:userClassDetails.count * 100)
    如果 ($classDetail.DeleteSubmissionsProcessed eq"False")
    {
        请尝试
        {
            if($removeMemberFromClass.IsPresent)
            {
                编写主机"$($classDetail.ClassName) 中的删除用户"
                删除 MemberFromClass classDetails $classDetail
            }
            编写主机"删除 $($classDetails.ClassName) 的用户的工作分配"
            删除分配 classDetails $classDetail
        }
        捕获
        {
            写错误 $ _。Exception.Message
        }
    }
    $progressTracker + +
}

$directoryPath = (获取项目-路径"。 \"-详细)。全名
$script: deleteAssignmentsReport |导出 Csv-路径.\DeleteAssignmentsReport.csv NoTypeInformation-强制
编写主机"报告 file(DeleteAssignmentsReport.csv) 生成在 $directoryPath\DeleteAssignmentsReport.csv"
编写主机"更新类详细信息 file($($directoryPathOfFile)) 和生成的已更新的文件位于 $($directoryPathOfFile)"

扩展你的 Office 技能
了解培训
抢先获得新功能
加入 Office 预览体验计划

此信息是否有帮助?

谢谢您的反馈!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×