分配脚本-导出

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

导出-EDU 工作分配

< #
   .概要
    导出 Edu 分配数据中的一组类 csv 文件中指定用户。
    .说明
    脚本从输入的 csv 文件中读取用户的课程详细信息。获取分配和每个工作分配的提交并生成工作分配 file(assignment.json) 和报表 file(GetAssignmentsReport.csv)。完成提取的提交它将更新为 true 的特定类 GetSubmissionsProcessed 列。如果脚本失败之间我们可以重新运行该脚本使用相同的输入文件,因为该文件将更新为提交的最后一个删除。
   .示例
    .\Export-EduAssignments.ps1 userClassDetailsFile < 用户类详细信息 csv 文件的完整路径 >
   .参数 userClassDetailsFile
   这是 csv file(userClassDetails.csv),这是获取 UserClasses.ps1 脚本的输出。此文件有用户类别和删除和获取提交处理是否信息。此值应为完整路径 file(drive:\GDPR\userClassDetails.csv)
   .笔记
   我们需要 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
)

# 加载 ADAL
添加类型-路径".\ADAL\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
$educationEndpoint ="https://graph.microsoft.com/beta/education/"
$script: userClassDetails = @ ()
$script: getAssignmentsReport = @ ()
$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=$false) $classId,
        Parameter(Mandatory=$false) $className,
        Parameter(Mandatory=$true) $OperationName
    )

对于 ($i = 1; $i-le $script: maxRetryAttempt; $i + +)
    {
        请尝试
        {
            $APIResult = 调用 WebRequest-方法获取 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: getAssignmentsReport + = [PSCustomObject] @{
                RequestUrl = $url
                方法 ="获取"
                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: getAssignmentsReport + = [PSCustomObject] @{
                RequestUrl = $url
                方法 ="获取"
                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
            }
        }
    }
}

#get 分配
函数获取分配
{
    参数 (
        Parameter(Mandatory=$true) $classDetails
    )
    请尝试
    {
        $classId = $classDetails.ClassId
        $userId = $classDetails.UserId
        $role = $classDetails.Role
        $className = $classId
        如果 ($classDetails.ClassName 新 $null-和 $classDetail.ClassName.Length 新 0)
        {
            $className = $classDetails.ClassName
        }
        $getAssignmentsUri = ("{0} / classes('{1}')/assignments?TargetUserId = {2} & UserClassRole = {3}"-f $educationEndpoint,$classId,$userId,$role)
        $assignments = $null
        $assignments = 调用 RequestWithRetry-url $getAssignmentsUri-classId $classId-类名 $className-操作名称"GetAssignments"
        $outputstring =""
        如果 ($assignments 新 $null)
        {
            $valueStartIndex = ($assignments.content.indexof('"value":') + 8)
            $valueEndIndex = $assignments.content.Length
            $valueString = $assignments.content.substring ($valueStartIndex,$valueEndIndex $valueStartIndex-1)

            $valueString = $valueString.TrimEnd("]")
            $valueString = $valueString.TrimStart("[")
            $indexValues = (($valuestring | 选择字符串"classId":-AllMatches)。Matches.Index)
            编写主机"Retrieved $($indexValues.count) 分配 $className 类"
            $assignmentsStrings = @ ()
            对于 ($i = 0; $i-浅色 $indexValues.count; $i + +)
            {
                如果 ($i-新 $indexValues.count-1)
                {
                    $assignmentsStrings + = $valueString.substring (($indexValues [$i]-1),($indexValues [$i + 1]-$indexValues [$i]-1))
                }
                其他
                {
                    $assignmentsStrings + = $valueString.substring(($indexValues[$i]-1),($valueString.Length-$indexValues [$i] + 1))
                }

                如果 ($role eq"学生")
                {
                    $submissionsIndex = $assignmentsStrings[$i].indexof('"submissions":[')
                    $assignmentsStrings [$i] = [$i] $assignmentsStrings.substring (0,则 $submissionsIndex + 15)
                    $assignmentsStrings [$i] = [$i] $assignmentsStrings +"]}"
                }
            }
            对于 ($i = 0; $i-浅色 $assignmentsStrings.Length; $i + +)
            {
                $assignmentString = $assignmentsStrings [$i]
                $assignmentJson = $assignmentString |ConvertFrom Json
                $assignmentId = $assignmentJson.id
                编写主机"前提交 $($assignmentJson.displayName) 工作分配"
                $sumbmissionsEndpoint = ("{0} / classes('{1}')/assignments('{2}')/submissions?TargetUserId = {3} & UserClassRole = {4}"-f $educationEndpoint,$classId、 $assignmentId、 $userId、 $role)
                $submissions = 调用 RequestWithRetry classId $classId-url $sumbmissionsEndpoint 类名 $className-操作名称"GetSubmissions"
                如果 ($submissions 新 $null-和 $submissions。Content.Length 新 0)
                {
                    $submissionsJson = $submissions.content |ConvertFrom Json
                    编写主机"Retrieved $($submissionsJson.value.count) 提交 $($assignmentJson.displayName) 工作分配"
                    $valueStartIndex = ($submissions.content.indexof('"value":') + 9)
                    $valueEndIndex = $submissions.content.lastindexof("}")
                    $submissionsString = $submissions.content.substring ($valueStartIndex,$valueEndIndex $valueStartIndex-1)
                    $assignmentsStrings [$i] = $assignmentsStrings [$i]。TrimEnd("]}")
                    $assignmentsStrings [$i] = [$i] $assignmentsStrings $submissionsString +"]}"
                }
            }

            $completeAssigmentsString ="["
            如果 ($assignmentsStrings.Length eq 0)
            {
                $completeAssigmentsString = $completeAssigmentsString +"]"
            }
            其他
            {
                对于 ($i = 0; $i-浅色 $assignmentsStrings.Length; $i + +)
                {
                    如果 ($i-eq $assignmentsStrings.Length-1)
                    {
                        $completeAssigmentsString = $completeAssigmentsString + $assignmentsStrings [$i] +"]"
                    }
                    其他
                    {
                        $completeAssigmentsString = $completeAssigmentsString + $assignmentsStrings [$i] +","
                    }
                }
            }
            $outputstring = {"ClassId":"+ $classId + '","类名":"+ $className +"、"工作分配": + $completeAssigmentsString + '}'
            $dateTimeStamp = $(获取日期-f yyyy 毫米 dd)
            $fileName = $directoryPath +"\"+ $className +"_"+ $userId +"_"+ $dateTimeStamp +".json"
            $outputstring |传出文件 $fileName
            编写 Host("Assignments file for $className is generated at $fileName")
            $classDetails.GetSubmissionsProcessed ="true"
            $script: userClassDetails |导出 Csv-路径 $($directoryPathOfFile) NoTypeInformation-强制
        }
    }
    捕获
    {
        写错误 $ _。Exception.Message
    }

}                                           

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

$progressTracker = 1。
#loop 通过每行中,然后如果 getsubmissionsprocessed 列为 false,则获取提交
foreach (在 $script $classDetail: userClassDetails)
{
    编写进度-活动"获得分配用户"的状态"处理类: $($classDetail.classId)"的完成百分比 ($progressTracker / $($脚本: userClassDetails |Measure-object).count * 100)
    如果 ($classDetail.GetSubmissionsProcessed eq"False")
    {
        编写主机"的 $($classDetail.ClassName) 的入门分配"
        获取分配 classDetails $classDetail
    }
    $progressTracker + +
}

$script: getAssignmentsReport |导出 Csv-路径.\GetAssignmentsReport.csv NoTypeInformation
编写主机"报告 file(GetAssignmentsReport.csv) 生成在 $directoryPath\GetAssignmentsReport.csv"
编写主机"更新类详细信息 file($($directoryPathOfFile)) 和生成的已更新的文件位于 $($directoryPathOfFile)"

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

此信息是否有帮助?

谢谢您的反馈!

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

×