├── .github ├── ISSUE_TEMPLATE │ └── BUG-REPORT.yml └── pull_request_template.md ├── .gitignore ├── CSV Samples ├── SDS Format │ ├── 100 Users │ │ ├── School.csv │ │ ├── Section.csv │ │ ├── Student.csv │ │ ├── StudentEnrollment.csv │ │ ├── Teacher.csv │ │ └── TeacherRoster.csv │ ├── 25 Users │ │ ├── School.csv │ │ ├── Section.csv │ │ ├── Student.csv │ │ ├── StudentEnrollment.csv │ │ ├── Teacher.csv │ │ └── TeacherRoster.csv │ └── Min Required Attributes │ │ ├── School.csv │ │ ├── Section.csv │ │ ├── Student.csv │ │ ├── StudentEnrollment.csv │ │ ├── Teacher.csv │ │ └── TeacherRoster.csv ├── SDS v2.1 │ ├── academicSessions.csv │ ├── classes.csv │ ├── courses.csv │ ├── demographics.csv │ ├── enrollments.csv │ ├── orgs.csv │ ├── relationships.csv │ ├── roles.csv │ ├── userFlags.csv │ └── users.csv ├── SDS v2 │ ├── classes.csv │ ├── enrollments.csv │ ├── orgs.csv │ └── users.csv └── UK Format │ ├── 100 Users │ ├── School.csv │ ├── Section.csv │ ├── Student.csv │ ├── StudentEnrollment.csv │ ├── Teacher.csv │ └── TeacherRoster.csv │ ├── 25 Users │ ├── School.csv │ ├── Section.csv │ ├── Student.csv │ ├── StudentEnrollment.csv │ ├── Teacher.csv │ └── TeacherRoster.csv │ └── Min Required Attributes │ ├── School.csv │ ├── Section.csv │ ├── Student.csv │ ├── StudentEnrollment.csv │ ├── Teacher.csv │ └── TeacherRoster.csv ├── CustomSolutions ├── .gitkeep ├── Create-non_SDS_Information_Barriers.ps1 ├── SDS_ADF_ETL_Integrations │ ├── Canvas │ │ ├── Canvas_to_SDS_ADF_template.json │ │ ├── README.md │ │ └── img │ │ │ ├── add_trigger.png │ │ │ ├── deactivate_activity.png │ │ │ ├── debug_dataFlow.png │ │ │ ├── main_pipeline.png │ │ │ ├── new_alert_rule.png │ │ │ ├── new_trigger.png │ │ │ ├── pipeline_run_results.png │ │ │ └── run_pipeline.png │ ├── OneRoster │ │ ├── OneRoster_to_SDS_ADF_Template.json │ │ ├── README.md │ │ └── img │ │ │ ├── add_trigger.png │ │ │ ├── deactivate_activity.png │ │ │ ├── debug_dataFlow.png │ │ │ ├── main_pipeline.png │ │ │ ├── new_alert_rule.png │ │ │ ├── new_trigger.png │ │ │ ├── pipeline_run_results.png │ │ │ ├── refcode_storage.png │ │ │ └── run_pipeline.png │ └── SchoologyCSV │ │ ├── README.md │ │ ├── img │ │ ├── add_trigger.png │ │ ├── deactivate_activity.png │ │ ├── main_pipeline.png │ │ ├── new_alert_rule.png │ │ ├── new_trigger.png │ │ ├── pipeline_run_results.png │ │ └── run_pipeline.png │ │ └── schoologyCSV-SDS_ADF_ARM_template.json ├── TeamTemplateExport │ ├── .gitkeep │ ├── App.config │ ├── AzureBlob.cs │ ├── AzureCloudQueue.cs │ ├── DeploymentManifest.cs │ ├── DeploymentManifest.xsd │ ├── DistributeTemplates.csproj │ ├── DistributeTemplates.csproj.user │ ├── Logger.cs │ ├── ManifestPackage.cs │ ├── MigrationApiDemo.cs │ ├── MigrationPackageFile.cs │ ├── Program.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── SharePointMigrationTarget.cs │ ├── SourceFile.cs │ ├── TestDataProvider.cs │ ├── UpdateMessage.cs │ └── obj │ │ └── Debug │ │ └── DesignTimeResolveAssemblyReferencesInput.cache ├── TeamTemplateImport │ ├── .gitkeep │ ├── App.config │ ├── Program.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── SQL Scripts │ │ ├── TeamsTemplates.Database.sql │ │ ├── dbo.Courses.Table.sql │ │ ├── dbo.Logs.Table.sql │ │ ├── dbo.TemplateChannels.Table.sql │ │ ├── dbo.TemplateClassFiles.Table.sql │ │ ├── dbo.TemplateFiles.Table.sql │ │ └── dbo.Templates.Table.sql │ └── TeamTemplateImport.csproj └── readme ├── EDU Graph - Postman ├── EDU Graph - Assignments.postman_collection.json ├── EDU Graph - Classwork.postman_collection.json ├── EDU Graph - Data API.postman_collection.json ├── EDU Graph - Environment.json ├── EDU Graph - SDS Classic.postman_collection.json └── EDU Graph - industryData - SDS.postman_collection.json ├── EDU Storage Contributions └── Microsoft-EDU-Storage-Entitlements-by-SKU.csv ├── LICENSE.txt ├── LTI Scripts ├── Get-OneDriveLTI-Groups.ps1 ├── IdentifyingClassTeams.md ├── IdentifyingOneDriveGroups.md └── README.md ├── O365-EDU-Tools.yml ├── OneRosterTools └── PostmanCollection │ ├── OneRoster-CredentialsTemplate.postman_environment.json │ ├── SDS V2 OneRoster v1.1-OAuth2.postman_collection.json │ └── readme.md ├── README.md ├── SDS Scripts ├── Archived │ ├── Add-Intune_Licenses.ps1 │ ├── Get-All_SDS_Attributes.ps1 │ ├── Get-All_SDS_Troubleshooting_Attributes.ps1 │ ├── Get-All_Users_With_and_Without_Classroom.ps1 │ ├── MigrateClassGroupsToTeams.ps1 │ ├── Remove-All_Schools.ps1 │ ├── Remove-All_Section_Memberships.ps1 │ ├── Remove-Intune_Licenses.ps1 │ ├── Rename-Expired_Classes.ps1 │ ├── Retire-Classroom_Preview_Sections.ps1 │ ├── Set-Classroom_License_for_All_Users.ps1 │ ├── Set-Classroom_License_for_Some_Users.ps1 │ ├── Unrename-Expired_Classes.ps1 │ └── v2MigrateClassGroupsToTeams.ps1 ├── Block Azure AD Portal │ ├── Block-AzureADPortal_for_everyone_except_a_list_of_admins.ps1 │ ├── Block-AzureADPortal_for_everyone_except_me.ps1 │ └── IntuneforEducationAdmins.csv ├── Block PowerShell │ ├── Block-MS_Graph_module_for_everyone_except_a_list_of_admins.ps1 │ ├── Block-MS_Graph_module_for_everyone_except_me.ps1 │ ├── Block-PowerShell_for_everyone_except_a_list_of_admins.ps1 │ ├── Block-PowerShell_for_everyone_except_me.ps1 │ └── psadmins.csv ├── Connection Scripts │ ├── Connect-Azure_AD_V1.ps1 │ ├── Connect-Azure_AD_V1_and_Exchange_Online.ps1 │ ├── Connect-Azure_AD_V2.ps1 │ ├── Connect-Exchange_Online.ps1 │ ├── Connect-Microsoft_Teams.ps1 │ ├── Install-AAD_Module_and_Sign_in_Assistant.ps1 │ ├── Install-Azure_AD_V2.ps1 │ └── Install-Teams_Module.txt ├── Consent Scripts │ ├── Get-StudentsByLicense.ps1 │ └── Set-MinorWithParentalConsent.ps1 ├── Create-SDS_Information_Barriers.ps1 ├── Email Restrictions │ ├── Export-Class_Membership_for_Restrictions.ps1 │ ├── New-DDL_for_All_Admins.ps1 │ ├── New-DDL_for_All_Students.ps1 │ ├── New-DDL_for_All_Teachers.ps1 │ ├── New-DDL_for_Students_by_Grade.ps1 │ ├── New-Transport_Rule_Inbound.ps1 │ ├── New-Transport_Rule_Outbound.ps1 │ ├── Set-Acceptance_Permissions_All_Admins.ps1 │ ├── Set-Acceptance_Permissions_All_Students.ps1 │ ├── Set-Acceptance_Permissions_All_Teachers.ps1 │ ├── Set-Acceptance_Permissions_SDS_Sections.ps1 │ └── Set-Acceptance_Permissions_Students_by_Grade.ps1 ├── Get-All_SDS_Attributes.ps1 ├── Get-All_SDS_Attributes_NoRosters.ps1 ├── Get-All_SDS_Troubleshooting_Attributes.ps1 ├── Get-All_Schools_and_Memberships.ps1 ├── Get-All_Sections.ps1 ├── Get-All_Sections_and_Membership_Counts.ps1 ├── Get-All_Sections_and_Memberships.ps1 ├── Get-All_Students_and_Teachers.ps1 ├── Get-Guardians.ps1 ├── Get-PowerSchool_API.ps1 ├── Get-SectionUsageReport.ps1 ├── Get-User_Information_Barrier_Segments.ps1 ├── License Scripts │ ├── Add-Intune_Licenses.ps1 │ └── Remove-Intune_Licenses.ps1 ├── MigrateClassGroupsToTeams.ps1 ├── Remove-All_Schools.ps1 ├── Remove-All_Section_Memberships.ps1 ├── Remove-All_Sections.ps1 ├── Remove-Expired_Section_Memberships.ps1 ├── Remove-Expired_Sections.ps1 ├── Remove-SchoolAU_Memberships.ps1 ├── Remove-SchoolSG_Memberships.ps1 ├── Remove-Student_Attributes.ps1 ├── Remove-Unused_Sections.ps1 ├── Rename-Expired_Classes.ps1 ├── Reset-Guardians.ps1 ├── Restore-V1_AnchorID_Attributes.ps1 ├── Set-All_Sections_as_Hidden.ps1 ├── Set-Email_Addresses_Expired.ps1 ├── Set-Expired_Sections_Hidden.ps1 ├── Set-SDS_Attributes_For_Administrative_Units.ps1 ├── Set-SDS_Attributes_For_All_Teachers_Security_Group.ps1 ├── Set-Some_Sections_as_Hidden.ps1 ├── Unrename-Expired_Classes.ps1 ├── Update-AnchorID_Attributes.ps1 └── common.ps1 ├── SDSDataLakeTroubleshooting └── TroubleshootSDSDataLake.pbit ├── SDSProfileManagementDocs ├── README.md ├── api │ ├── educationsynchronizationerrors_get.md │ ├── educationsynchronizationprofile_delete.md │ ├── educationsynchronizationprofile_get.md │ ├── educationsynchronizationprofile_list.md │ ├── educationsynchronizationprofile_pause.md │ ├── educationsynchronizationprofile_post.md │ ├── educationsynchronizationprofile_put.md │ ├── educationsynchronizationprofile_reset.md │ ├── educationsynchronizationprofile_resume.md │ ├── educationsynchronizationprofile_start.md │ ├── educationsynchronizationprofile_uploadurl.md │ └── educationsynchronizationprofilestatus_get.md ├── resources │ ├── educationSynchronizationConnectionSettings.md │ ├── educationSynchronizationOAuth1ConnectionSettings.md │ ├── educationSynchronizationOAuth2ClientCredentialsConnectionSettings.md │ ├── educationcsvdataprovider.md │ ├── educationfilesynchronizationverificationmessage.md │ ├── educationidentitycreationconfiguration.md │ ├── educationidentitydomain.md │ ├── educationidentitymatchingconfiguration.md │ ├── educationidentitymatchingoptions.md │ ├── educationidentitysynchronizationconfiguration.md │ ├── educationonerosterapidataprovider.md │ ├── educationpowerschooldataprovider.md │ ├── educationsynchronizationcustomization.md │ ├── educationsynchronizationcustomizations.md │ ├── educationsynchronizationdataprovider.md │ ├── educationsynchronizationerror.md │ ├── educationsynchronizationlicenseassignment.md │ ├── educationsynchronizationprofile.md │ └── educationsynchronizationprofilestatus.md └── scenarios │ ├── Images │ ├── AddGraphAPI.PNG │ ├── AddPermissions.PNG │ └── Settings.PNG │ ├── create-api-synchronization-profile.md │ ├── create-synchronization-profile.md │ ├── synchronization-profile-api-introduction.md │ ├── troubleshooting-sync-failures.md │ └── update-synchronization-profile.md ├── SECURITY.md └── Teams Scripts ├── Add-GroupOwners-To-Teams.ps1 └── Sync-GroupMembership-To-Team.ps1 /.github/ISSUE_TEMPLATE/BUG-REPORT.yml: -------------------------------------------------------------------------------- 1 | name: Bug Report 2 | description: File a bug report 3 | title: "[Bug]: " 4 | labels: ["bug"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thanks for taking the time to fill out this bug report! 10 | - type: input 11 | id: filepath 12 | attributes: 13 | label: File Path(s) 14 | description: What file(s) have the issue? 15 | placeholder: ex. /folderName/fileName.xxx 16 | validations: 17 | required: false 18 | - type: textarea 19 | id: what-happened 20 | attributes: 21 | label: What happened? 22 | description: Also tell us, what did you expect to happen? Include any relevant info (i.e. screen shot, line numbers, code snippet, etc.) 23 | placeholder: Tell us what you see! 24 | value: "A bug happened!" 25 | validations: 26 | required: true 27 | - type: textarea 28 | id: logs 29 | attributes: 30 | label: Relevant log output 31 | description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. 32 | render: shell 33 | - type: checkboxes 34 | id: terms 35 | attributes: 36 | label: Code of Conduct 37 | description: By submitting this issue, you agree to follow the Microsoft Open Source Code of Conduct. For more information, see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments. 38 | options: 39 | - label: I agree to follow this project's Code of Conduct 40 | required: true 41 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ### Related Issue 2 | _Please put the related issue number to reference if applicable_ 3 | 4 | ### Summary 5 | _Brief description of what was changed_ 6 | 7 | ### Reason 8 | _Why is this change being proposed?_ 9 | 10 | ### Proposed Change(s) 11 | - change 1 12 | - change 2 13 | - change N 14 | 15 | ### Details 16 | _Detailed description of the change(s)_ 17 | 18 | ### Additional Info 19 | _Any additional information or context_ 20 | 21 | ### References 22 | [Example](www.microsoft.com) 23 | 24 | ### Checklist 25 | - [ ] Documentation 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # This .gitignore file was automatically created by Microsoft(R) Visual Studio. 3 | ################################################################################ 4 | 5 | /.vs/ProjectSettings.json 6 | /.vs/slnx.sqlite 7 | /.vs/O365-EDU-Tools/v15/.suo 8 | /.vs/slnx.sqlite-journal 9 | /.vs/VSWorkspaceState.json 10 | /.vs/config/applicationhost.config 11 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/100 Users/School.csv: -------------------------------------------------------------------------------- 1 | SIS ID,Name,School Number,School NCES_ID,State ID,Grade Low,Grade High,Principal SIS ID,Principal Name,Principal Secondary Email,Address,City,State,Country,Zip,Phone,Zone 2 | 10001,Contoso High School,10001,1,WA,9,12,14007,Amy Roebuck,,2 Microsoft Way,Redmond,WA,US,98052,555-123-4567,1 3 | 10002,Fabrikam High School,10002,2,WA,9,12,14008,Harry James,,3 Microsoft Way,Redmond,WA,US,98052,555-987-6543,2 4 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/100 Users/Section.csv: -------------------------------------------------------------------------------- 1 | SIS ID,School SIS ID,Section Name,Section Number,Term SIS ID,Term Name,Term StartDate,Term EndDate,Course SIS ID,Course Name,Course Number,Course Description,Course Subject,Periods,Status 2 | 11001,10001,Math - Algebra 1,11001,12000,SY1516,7/1/2017,6/30/2018,11001,Math 101,101,Algebra Level 1,Math,1,Active 3 | 11002,10001,Math - Algebra 2,11002,12000,SY1516,7/1/2017,6/30/2018,11002,Math 102,102,Algebra Level 2,Math,1,Active 4 | 11003,10001,English - Language 1,11003,12000,SY1516,7/1/2017,6/30/2018,11003,English 201,201,English Level 1,English,2,Active 5 | 11004,10001,English - Language 2,11004,12000,SY1516,7/1/2017,6/30/2018,11004,English 202,202,English Level 2,English,2,Active 6 | 11005,10001,History - World History 1,11005,12000,SY1516,7/1/2017,6/30/2018,11005,History 301,301,World History Level 1,History,3,Active 7 | 11006,10001,History - World History 2,11006,12000,SY1516,7/1/2017,6/30/2018,11006,History 302,302,World history Level 2,History,3,Active 8 | 11007,10001,Science - Biology 1,11007,12000,SY1516,7/1/2017,6/30/2018,11007,Science 401,401,Biology Level 1,Science,4,Active 9 | 11008,10001,Science - Biology 2,11008,12000,SY1516,7/1/2017,6/30/2018,11008,Science 402,402,Biology Level 2,Science,4,Active 10 | 11009,10001,Health 1,11009,12000,SY1516,7/1/2017,6/30/2018,11009,Health 501,501,Health Level 1,Health,5,Active 11 | 11010,10001,Health 2,11010,12000,SY1516,7/1/2017,6/30/2018,11010,Health 502,502,Health Level 2,Health,5,Active 12 | 11011,10001,Technology - Programming 1,11011,12000,SY1516,7/1/2017,6/30/2018,11011,Technology 601,601,Programming Level 1,Technology,6,Active 13 | 11012,10001,Technology - Programming 2,11012,12000,SY1516,7/1/2017,6/30/2018,11012,Technology 602,602,Programming Level 2,Technology,6,Active 14 | 11013,10001,Physical Education 1,11013,12000,SY1516,7/1/2017,6/30/2018,11013,Gym 701,701,Phyical Education 1,Gym,7,Active 15 | 11014,10001,Physical Education 2,11014,12000,SY1516,7/1/2017,6/30/2018,11014,Gym 702,702,Physical Education 2,Gym,7,Active 16 | 11015,10002,Math - Algebra 1,11015,12000,SY1516,7/1/2017,6/30/2018,11015,Math 101,101,Algebra Level 1,Math,1,Active 17 | 11016,10002,English - Language 1,11016,12000,SY1516,7/1/2017,6/30/2018,11016,English 201,201,English Level 1,English,2,Active 18 | 11017,10002,History - World History 1,11017,12000,SY1516,7/1/2017,6/30/2018,11017,History 301,301,World History Level 1,History,3,Active 19 | 11018,10002,Science - Biology 1,11018,12000,SY1516,7/1/2017,6/30/2018,11018,Science 401,401,Biology Level 1,Science,4,Active 20 | 11019,10002,Health 1,11019,12000,SY1516,7/1/2017,6/30/2018,11019,Health 501,501,Health Level 1,Health,5,Active 21 | 11020,10002,Technology - Programming 1,11020,12000,SY1516,7/1/2017,6/30/2018,11020,Technology 601,601,Programming Level 1,Technology,6,Active 22 | 11021,10002,Physical Education 1,11021,12000,SY1516,7/1/2017,6/30/2018,11021,Gym 701,701,Phyical Education 1,Gym,7,Active 23 | 11022,10002,Math - Algebra 2,11022,12000,SY1516,7/1/2017,6/30/2018,11022,Math 102,102,Algebra Level 2,Math,1,Active 24 | 11023,10002,English - Language 2,11023,12000,SY1516,7/1/2017,6/30/2018,11023,English 202,202,English Level 2,English,2,Active 25 | 11024,10002,History - World History 2,11024,12000,SY1516,7/1/2017,6/30/2018,11024,History 302,302,World History Level 2,History,3,Active 26 | 11025,10002,Science - Biology 2,11025,12000,SY1516,7/1/2017,6/30/2018,11025,Science 402,402,Biology Level 2,Science,4,Active 27 | 11026,10002,Health 2,11026,12000,SY1516,7/1/2017,6/30/2018,11026,Health 502,502,Health Level 2,Health,5,Active 28 | 11027,10002,Technology - Programming 2,11027,12000,SY1516,7/1/2017,6/30/2018,11027,Technology 602,602,Programming Level 2,Technology,6,Active 29 | 11028,10002,Physical Education 2,11028,12000,SY1516,7/1/2017,6/30/2018,11028,Gym 702,702,Phyical Education 2,Gym,7,Active 30 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/100 Users/Teacher.csv: -------------------------------------------------------------------------------- 1 | SIS ID,School SIS ID,First Name,Last Name,Username,Password,State ID,Teacher Number,Status,Middle Name,Secondary Email,Title,Qualification 2 | 14001,10001,Craig,Beane,CBeane,P@ssw0rd,WA,101,Active,James,,, 3 | 14002,10001,Daisy,Todd,DTodd,P@ssw0rd,WA,102,Active,Francis,,, 4 | 14003,10001,Dana,Mills,DMills,P@ssw0rd,WA,103,Active,Lynn,,, 5 | 14004,10001,Rocky,Jaime,RJaime,P@ssw0rd,WA,104,Active,Brandon,,, 6 | 14005,10001,Dolly,Wyatt,DWyatt,P@ssw0rd,WA,105,Active,Robert,,, 7 | 14006,10001,Kristie,Mitchell,KMitchell,P@ssw0rd,WA,106,Active,Timothy,,, 8 | 14007,10001,Felicia,Flowers,FFlowers,P@ssword,WA,107,Active,Lynn,,, 9 | 14008,10002,Hope,Todd,HTodd,P@ssword,WA,108,Active,Christopher,,, 10 | 14009,10002,Edna,Doyle,EDoyle,P@ssword,WA,109,Active,Bradley,,, 11 | 14010,10002,Shawna,Roy,SRoy,P@ssword,WA,110,Active,Brandon,,, 12 | 14011,10002,Tammie,Benton,TBenton,P@ssword,WA,111,Active,Robert,,, 13 | 14012,10002,Susana,Rocha,SRocha,P@ssword,WA,112,Active,Lynn,,, 14 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/100 Users/TeacherRoster.csv: -------------------------------------------------------------------------------- 1 | Section SIS ID,SIS ID 2 | 11001,14001 3 | 11002,14002 4 | 11003,14001 5 | 11004,14002 6 | 11005,14003 7 | 11006,14004 8 | 11007,14003 9 | 11008,14004 10 | 11009,14005 11 | 11010,14006 12 | 11011,14005 13 | 11012,14007 14 | 11013,14007 15 | 11014,14006 16 | 11015,14008 17 | 11016,14009 18 | 11017,14010 19 | 11018,14011 20 | 11019,14012 21 | 11020,14008 22 | 11021,14009 23 | 11022,14009 24 | 11023,14010 25 | 11024,14011 26 | 11025,14012 27 | 11026,14008 28 | 11027,14009 29 | 11028,14010 30 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/25 Users/School.csv: -------------------------------------------------------------------------------- 1 | SIS ID,Name,School Number,School NCES_ID,State ID,Grade Low,Grade High,Principal SIS ID,Principal Name,Principal Secondary Email,Address,City,State,Country,Zip,Phone,Zone 2 | 10001,Contoso High School,10001,1,WA,9,12,14007,Amy Roebuck,,2 Microsoft Way,Redmond,WA,US,98052,555-123-4567,1 3 | 10002,Fabrikam High School,10002,2,WA,9,12,14008,Harry James,,3 Microsoft Way,Redmond,WA,US,98052,555-987-6543,2 4 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/25 Users/Section.csv: -------------------------------------------------------------------------------- 1 | SIS ID,School SIS ID,Section Name,Section Number,Term SIS ID,Term Name,Term StartDate,Term EndDate,Course SIS ID,Course Name,Course Number,Course Description,Course Subject,Periods,Status 2 | 11001,10001,Math - Algebra 1,11001,12000,SY1516,7/1/2017,6/30/2018,11001,Math 101,101,Algebra Level 1,Math,1,Active 3 | 11002,10001,Math - Algebra 2,11002,12000,SY1516,7/1/2017,6/30/2018,11002,Math 102,102,Algebra Level 2,Math,1,Active 4 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/25 Users/Student.csv: -------------------------------------------------------------------------------- 1 | SIS ID,School SIS ID,First Name,Last Name,Username,Password,State ID,Secondary Email,Student Number,Middle Name,Grade,Status,Birthdate,Graduation Year 2 | 13001,10001,Ora,Klein,OKlein,P@ssword,WA,,13001,Christopher,9,Active,4/2/2000,2019 3 | 13002,10001,Beulah,McMillan,BMcMillan,P@ssword,WA,,13002,Lynn,10,Active,11/12/1999,2018 4 | 13003,10001,Florence,Stark,FStark,P@ssword,WA,,13003,Brian,12,Active,12/19/1997,2016 5 | 13004,10001,Noah,Gilbertson,NGilbertson,P@ssword,WA,,13004,Daniel,9,Active,6/20/2000,2019 6 | 13005,10001,Erna,Parker,EParker,P@ssword,WA,,13005,Troy,11,Active,5/17/1998,2017 7 | 13006,10001,Sherry,Santana,SSantana,P@ssword,WA,,13006,Thomas,10,Active,8/22/1999,2018 8 | 13007,10001,Ronald,Lees,RLees,P@ssword,WA,,13012,Grace,9,Active,5/11/1998,2019 9 | 13008,10001,Latasha,Pratt,LPratt,P@ssword,WA,,13013,Christopher,11,Active,8/13/1999,2016 10 | 13009,10001,Misty,Thomas,MThomas,P@ssword,WA,,13014,Lynn,10,Active,7/6/2000,2017 11 | 13010,10001,Petra,Barlow,PBarlow,P@ssword,WA,,13015,Francis,9,Active,3/19/1997,2019 12 | 13011,10001,Bonnie,Hampton,PHampton,P@ssword,WA,,13016,Robert,12,Active,4/10/1998,2017 13 | 13012,10001,Dion,Matheson,DMatheson,P@ssword,WA,,13017,James,10,Active,5/17/1999,2017 14 | 13013,10001,Cesar,McCray,CMcCray,P@ssword,WA,,13018,Wilma,9,Active,2/17/2001,2020 15 | 13014,10001,Rickey,Cottle,Rcottle,P@ssword,WA,,13019,Forrest,10,Active,8/9/2000,2019 16 | 13015,10001,Fredrick,Markley,Fmarkley,P@ssword,WA,,13020,Noah,11,Active,6/17/1999,2018 17 | 13016,10001,Joshua,Bartels,Jbartels,P@ssword,WA,,13021,Tracy,9,Active,3/19/2001,2020 18 | 13017,10001,Maribel,Parsons,Mparsons,P@ssword,WA,,13022,Delmar,10,Active,3/10/2000,2019 19 | 13018,10001,Erma,Ballard,Eballard,P@ssword,WA,,13023,Maya,12,Active,4/3/1998,2017 20 | 13019,10001,Wilfred,Bevins,Wbevins,P@ssword,WA,,13024,Casey,9,Active,4/13/2001,2020 21 | 13020,10001,Rogelio,Cazares,Rcazares,P@ssword,WA,,13025,Hal,10,Active,2/1/2000,2019 22 | 13021,10001,Dixie,Morrison,Dmorrison,P@ssword,WA,,13026,Chris,11,Active,8/12/1999,2018 23 | 13022,10001,Williams,Bisson,Wbisson,P@ssword,WA,,13027,Roxanne,9,Active,3/6/2001,2020 24 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/25 Users/StudentEnrollment.csv: -------------------------------------------------------------------------------- 1 | Section SIS ID,SIS ID 2 | 11001,13001 3 | 11001,13002 4 | 11001,13003 5 | 11001,13004 6 | 11001,13005 7 | 11001,13006 8 | 11001,13007 9 | 11001,13008 10 | 11001,13009 11 | 11001,13010 12 | 11001,13011 13 | 11001,13012 14 | 11001,13013 15 | 11001,13014 16 | 11001,13015 17 | 11001,13016 18 | 11001,13017 19 | 11001,13018 20 | 11001,13019 21 | 11001,13020 22 | 11001,13021 23 | 11001,13022 24 | 11002,13001 25 | 11002,13002 26 | 11002,13003 27 | 11002,13004 28 | 11002,13005 29 | 11002,13006 30 | 11002,13007 31 | 11002,13008 32 | 11002,13009 33 | 11002,13010 34 | 11002,13011 35 | 11002,13012 36 | 11002,13013 37 | 11002,13014 38 | 11002,13015 39 | 11002,13016 40 | 11002,13017 41 | 11002,13018 42 | 11002,13019 43 | 11002,13020 44 | 11002,13021 45 | 11002,13022 46 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/25 Users/Teacher.csv: -------------------------------------------------------------------------------- 1 | SIS ID,School SIS ID,First Name,Last Name,Username,Password,State ID,Teacher Number,Status,Middle Name,Secondary Email,Title,Qualification 2 | 14001,10001,Craig,Beane,CBeane,P@ssw0rd,WA,101,Active,James,,, 3 | 14002,10001,Daisy,Todd,DTodd,P@ssw0rd,WA,102,Active,Francis,,, 4 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/25 Users/TeacherRoster.csv: -------------------------------------------------------------------------------- 1 | Section SIS ID,SIS ID 2 | 11001,14001 3 | 11002,14002 4 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/Min Required Attributes/School.csv: -------------------------------------------------------------------------------- 1 | SIS ID,Name 2 | 10001,Contoso High School 3 | 10002,Fabrikam High School 4 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/Min Required Attributes/Section.csv: -------------------------------------------------------------------------------- 1 | SIS ID,School SIS ID,Section Name 2 | 11001,10001,Math - Algebra 1 3 | 11002,10001,Math - Algebra 2 4 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/Min Required Attributes/Student.csv: -------------------------------------------------------------------------------- 1 | SIS ID,School SIS ID,Username 2 | 13001,10001,OKlein 3 | 13002,10001,BMcMillan 4 | 13003,10001,FStark 5 | 13004,10001,NGilbertson 6 | 13005,10001,EParker 7 | 13006,10001,SSantana 8 | 13007,10001,RLees 9 | 13008,10001,LPratt 10 | 13009,10001,MThomas 11 | 13010,10001,PBarlow 12 | 13011,10001,PHampton 13 | 13012,10001,DMatheson 14 | 13013,10001,CMcCray 15 | 13014,10001,Rcottle 16 | 13015,10001,Fmarkley 17 | 13016,10001,Jbartels 18 | 13017,10001,Mparsons 19 | 13018,10001,Eballard 20 | 13019,10001,Wbevins 21 | 13020,10001,Rcazares 22 | 13021,10001,Dmorrison 23 | 13022,10001,Wbisson 24 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/Min Required Attributes/StudentEnrollment.csv: -------------------------------------------------------------------------------- 1 | Section SIS ID,SIS ID 2 | 11001,13001 3 | 11001,13002 4 | 11001,13003 5 | 11001,13004 6 | 11001,13005 7 | 11001,13006 8 | 11001,13007 9 | 11001,13008 10 | 11001,13009 11 | 11001,13010 12 | 11001,13011 13 | 11001,13012 14 | 11001,13013 15 | 11001,13014 16 | 11001,13015 17 | 11001,13016 18 | 11001,13017 19 | 11001,13018 20 | 11001,13019 21 | 11001,13020 22 | 11001,13021 23 | 11001,13022 24 | 11002,13001 25 | 11002,13002 26 | 11002,13003 27 | 11002,13004 28 | 11002,13005 29 | 11002,13006 30 | 11002,13007 31 | 11002,13008 32 | 11002,13009 33 | 11002,13010 34 | 11002,13011 35 | 11002,13012 36 | 11002,13013 37 | 11002,13014 38 | 11002,13015 39 | 11002,13016 40 | 11002,13017 41 | 11002,13018 42 | 11002,13019 43 | 11002,13020 44 | 11002,13021 45 | 11002,13022 46 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/Min Required Attributes/Teacher.csv: -------------------------------------------------------------------------------- 1 | SIS ID,School SIS ID,Username 2 | 14001,10001,CBeane 3 | 14002,10001,DTodd 4 | -------------------------------------------------------------------------------- /CSV Samples/SDS Format/Min Required Attributes/TeacherRoster.csv: -------------------------------------------------------------------------------- 1 | Section SIS ID,SIS ID 2 | 11001,14001 3 | 11002,14002 4 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2.1/academicSessions.csv: -------------------------------------------------------------------------------- 1 | sourcedId,title,type,schoolYear,startDate,endDate 2 | SY2021K12,2021 School Year,schoolYear,2021,2021-08-24,2022-06-11 3 | FS2021HED,Fall Semester,semester,2021,2021-09-01,2021-12-01 4 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2.1/classes.csv: -------------------------------------------------------------------------------- 1 | sourcedId,orgSourcedId,title,sessionSourcedIds,courseSourcedId 2 | 112001,110001,Computer Science 101,FS2021HED,C12001 3 | 112002,110003,Biology 10,SY2021K12,B102021 4 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2.1/courses.csv: -------------------------------------------------------------------------------- 1 | sourcedId,orgSourcedId,title,code,schoolYearSourcedId,subject,grade 2 | C12001,110001,Computer Science 101,CS101,SY2021K12,10,PS1 3 | C12002,110001,Computer Science 201,CS201,SY2021K12,10,PS2 4 | B102021,110003,Biology 10 2021,B10,SY2021K12,14,10 5 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2.1/demographics.csv: -------------------------------------------------------------------------------- 1 | userSourcedId,sex,birthDate,birthCity,birthState,birthCountry,ethnicityCodes,raceCodes 2 | 114001,male,2001-07-02,Woodenville,WA,USA,hispanicOrLatinoEthnicity, 3 | 114003,male,2002-03-02,Woodenville,WA,USA,,asian 4 | 114004,female,2001-09-02,Woodenville,WA,USA,,white 5 | 114006,male,1980-02-12,Seattle,WA,USA,,nativeHawaiianOrOtherPacificIslander 6 | 114007,female,1973-10-26,Sammamish,WA,USA,,demographicRaceTwoOrMoreRaces 7 | 114008,male,2001-06-06,Redmond,WA,USA,,blackOrAfricanAmerican 8 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2.1/enrollments.csv: -------------------------------------------------------------------------------- 1 | classSourcedId,userSourcedId,role 2 | 112001,114008,student 3 | 112001,114006,professor 4 | 112002,114001,student 5 | 112002,114003,student 6 | 112002,114004,student 7 | 112002,114007,teacher 8 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2.1/orgs.csv: -------------------------------------------------------------------------------- 1 | sourcedId,name,type,parentSourcedId 2 | 110001,College of Engineering,college, 3 | 110002,Computer Science Department,department,110001 4 | 110003,School of TwoDotOne,school,110004 5 | 110004,Ministry of TwoDotOne,ministryOfEducation, 6 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2.1/relationships.csv: -------------------------------------------------------------------------------- 1 | userSourcedId,relationshipUserSourcedId,relationshipRole 2 | 114001,114002,guardian 3 | 114003,114002,relative 4 | 114004,114005,guardian 5 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2.1/roles.csv: -------------------------------------------------------------------------------- 1 | userSourcedId,orgSourcedId,role,sessionSourcedId,grade,isPrimary,roleStartDate,roleEndDate 2 | 114001,110003,student,SY2021K12,10,TRUE,2021-08-24,2022-06-11 3 | 114003,110003,student,SY2021K12,10,TRUE,2021-08-24,2022-06-11 4 | 114004,110003,student,SY2021K12,10,TRUE,2021-08-24,2022-06-11 5 | 114006,110002,professor,FS2021HED,ps1,TRUE,2021-09-01,2021-12-01 6 | 114007,110004,teacher,SY2021K12,10,TRUE,2021-08-24,2022-06-11 7 | 114007,110003,teacher,SY2021K12,10,FALSE,2021-08-24,2022-06-11 8 | 114008,110001,student,FS2021HED,ps1,TRUE,2021-09-01,2021-12-01 9 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2.1/userFlags.csv: -------------------------------------------------------------------------------- 1 | userSourcedId,flag 2 | 114001,iep 3 | 114003,freeLunch 4 | 114004,504 5 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2.1/users.csv: -------------------------------------------------------------------------------- 1 | sourcedId,username,givenName,familyName,password,activeDirectoryMatchId,email,phone,sms 2 | 114001,jcraig@classrmtest31.org,Jack,Craig,P@ssword123,jcraig@classrmtest31.org,,, 3 | 114002,jean.craig@outlook.com,Jean,Craig,P@ssword123,,jean.craig@outlook.com,+11234567890,+11234567890 4 | 114003,fhutch@classrmtest31.org,Fred,Hutch,P@ssword123,fhutch@classrmtest31.org,,, 5 | 114004,asmithee@classrmtest31.org,Alice,Smithee,P@ssword123,asmithee@classrmtest31.org,,, 6 | 114005,bobsmithee@outlook.com,Bob,Smithee,P@ssword123,,bobsmithee@outlook.com,+10273841983,+10273841983 7 | 114006,jjonzer@classrmtest31.org,Jason,Jonzer,P@ssword123,jjonzer@classrmtest31.org,,, 8 | 114007,kfein@classrmtest31.org,Kristen,Fein,P@ssword123,kfein@classrmtest31.org,,, 9 | 114008,smiller@classrmtest31.org,Simon,Miller,P@ssword123,smiller@classrmtest31.org,,, 10 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2/classes.csv: -------------------------------------------------------------------------------- 1 | sourcedId,orgSourcedId,title 2 | 11001,10001,Math - Algebra 1 3 | 11002,10002,Math - Algebra 2 4 | 11003,10003,Intro to Agriculture 101 5 | 11004,10003,Bioscience Innovation 102 6 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2/enrollments.csv: -------------------------------------------------------------------------------- 1 | classSourcedId,userSourcedId,role 2 | 11001,13001,Student 3 | 11001,13002,Student 4 | 11001,13003,Student 5 | 11001,13004,Student 6 | 11001,13005,Student 7 | 11001,13006,Student 8 | 11002,13007,Student 9 | 11002,13008,Student 10 | 11002,13009,Student 11 | 11002,13010,Student 12 | 11002,13011,Student 13 | 11002,13012,Student 14 | 11002,13013,Student 15 | 11002,13014,Student 16 | 11003,13015,Student 17 | 11003,13016,Student 18 | 11003,13017,Student 19 | 11003,13018,Student 20 | 11004,13019,Student 21 | 11004,13020,Student 22 | 11004,13021,Student 23 | 11004,13022,Student 24 | 11001,14001,Teacher 25 | 11002,14002,Teacher 26 | 11002,14008,Staff 27 | 11002,14009,Faculty 28 | 11002,14010,Aide 29 | 11003,14011,Professor 30 | 11004,14012,Lecturer 31 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2/orgs.csv: -------------------------------------------------------------------------------- 1 | sourcedId,name,type,parentSourcedId 2 | 10000,K12 Ministry of Education,ministryofeducation, 3 | 10001,Contoso Middle School,school,10000 4 | 10002,Fabrikam High School,school,10000 5 | 10003,College of Higher Learning,college,10004 6 | 10004,University of Global Ed,university, 7 | -------------------------------------------------------------------------------- /CSV Samples/SDS v2/users.csv: -------------------------------------------------------------------------------- 1 | sourcedId,orgSourcedIds,givenName,familyName,username,password,role,grade 2 | 13001,10001,Ora,Klein,Oklein@classrmtest31.org,P@ssword123,Student,6 3 | 13002,10001,Beulah,McMillan,BMcMillan@classrmtest31.org,P@ssword123,Student,6 4 | 13003,10001,Florence,Stark,FStark@classrmtest31.org,P@ssword123,Student,6 5 | 13004,10001,Noah,Gilbertson,NGilbertson@classrmtest31.org,P@ssword123,Student,6 6 | 13005,10001,Erna,Parker,EParker@classrmtest31.org,P@ssword123,Student,6 7 | 13006,10001,Sherry,Santana,SSantana@classrmtest31.org,P@ssword123,Student,6 8 | 13007,10001,Ronald,Lees,RLees@classrmtest31.org,P@ssword123,Student,9 9 | 13008,10002,Latasha,Pratt,LPratt@classrmtest31.org,P@ssword123,Student,9 10 | 13009,10002,Misty,Thomas,MThomas@classrmtest31.org,P@ssword123,Student,9 11 | 13010,10002,Petra,Barlow,PBarlow@classrmtest31.org,P@ssword123,Student,9 12 | 13011,10002,Bonnie,Hampton,PHampton@classrmtest31.org,P@ssword123,Student,9 13 | 13012,10002,Dion,Matheson,DMatheson@classrmtest31.org,P@ssword123,Student,9 14 | 13013,10002,Cesar,McCray,CMcCray@classrmtest31.org,P@ssword123,Student,9 15 | 13014,10002,Rickey,Cottle,Rcottle@classrmtest31.org,P@ssword123,Student,9 16 | 13015,10003,Fredrick,Markley,Fmarkley@classrmtest31.org,P@ssword123,Student,PS1 17 | 13016,10003,Joshua,Bartels,Jbartels@classrmtest31.org,P@ssword123,Student,PS1 18 | 13017,10003,Maribel,Parsons,Mparsons@classrmtest31.org,P@ssword123,Student,PS1 19 | 13018,10003,Erma,Ballard,Eballard@classrmtest31.org,P@ssword123,Student,PS2 20 | 13019,10003,Wilfred,Bevins,Wbevins@classrmtest31.org,P@ssword123,Student,undergraduate 21 | 13020,10003,Rogelio,Cazares,Rcazares@classrmtest31.org,P@ssword123,Student,postgraduate 22 | 13021,10003,Dixie,Morrison,Dmorrison@classrmtest31.org,P@ssword123,Student,PS3 23 | 13022,10003,Williams,Bisson,Wbisson@classrmtest31.org,P@ssword123,Student,PS3 24 | 14001,10001,Craig,Beane,Cbeane@classrmtest31.org,P@ssword123,teacher,6 25 | 14002,10002,Daisy,Todd,Dtodd@classrmtest31.org,P@ssword123,teacher,9 26 | 14008,10002,Hope,Todd,Htodd@classrmtest31.org,P@ssword123,staff,6 27 | 14009,10002,Edna,Doyle,EDoyle@classrmtest31.org,P@ssword123,faculty,6 28 | 14010,10002,Shawna,Roy,SRoy@classrmtest31.org,P@ssword123,aide,9 29 | 14011,10003,Tammie,Benton,TBenton@classrmtest31.org,P@ssword123,Professor,PS1 30 | 14012,10003,Susana,Rocha,SRocha@classrmtest31.org,P@ssword123,Lecturer,PS3 31 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/100 Users/School.csv: -------------------------------------------------------------------------------- 1 | DfE Number,Name,School Number,School NCES_ID,State ID,Grade Low,Grade High,Principal SIS ID,Principal Name,Principal Secondary Email,Address,City,State,Country,Postal Code,Phone,Zone 2 | 10001,Contoso High School,10001,1,WA,9,12,14007,Amy Roebuck,,2 Microsoft Way,Redmond,WA,US,98052,555-123-4567,1 3 | 10002,Fabrikam High School,10002,2,WA,9,12,14008,Harry James,,3 Microsoft Way,Redmond,WA,US,98052,555-987-6543,2 4 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/100 Users/Section.csv: -------------------------------------------------------------------------------- 1 | ID,School DfE Number,Section Name,Section Number,Term SIS ID,Term Name,Term StartDate,Term EndDate,Course SIS ID,Course Name,Course Number,Course Description,Course Subject,Periods,Status 2 | 11001,10001,Math - Algebra 1,11001,12000,SY1516,7/1/2017,6/30/2018,11001,Math 101,101,Algebra Level 1,Math,1,Active 3 | 11002,10001,Math - Algebra 2,11002,12000,SY1516,7/1/2017,6/30/2018,11002,Math 102,102,Algebra Level 2,Math,1,Active 4 | 11003,10001,English - Language 1,11003,12000,SY1516,7/1/2017,6/30/2018,11003,English 201,201,English Level 1,English,2,Active 5 | 11004,10001,English - Language 2,11004,12000,SY1516,7/1/2017,6/30/2018,11004,English 202,202,English Level 2,English,2,Active 6 | 11005,10001,History - World History 1,11005,12000,SY1516,7/1/2017,6/30/2018,11005,History 301,301,World History Level 1,History,3,Active 7 | 11006,10001,History - World History 2,11006,12000,SY1516,7/1/2017,6/30/2018,11006,History 302,302,World history Level 2,History,3,Active 8 | 11007,10001,Science - Biology 1,11007,12000,SY1516,7/1/2017,6/30/2018,11007,Science 401,401,Biology Level 1,Science,4,Active 9 | 11008,10001,Science - Biology 2,11008,12000,SY1516,7/1/2017,6/30/2018,11008,Science 402,402,Biology Level 2,Science,4,Active 10 | 11009,10001,Health 1,11009,12000,SY1516,7/1/2017,6/30/2018,11009,Health 501,501,Health Level 1,Health,5,Active 11 | 11010,10001,Health 2,11010,12000,SY1516,7/1/2017,6/30/2018,11010,Health 502,502,Health Level 2,Health,5,Active 12 | 11011,10001,Technology - Programming 1,11011,12000,SY1516,7/1/2017,6/30/2018,11011,Technology 601,601,Programming Level 1,Technology,6,Active 13 | 11012,10001,Technology - Programming 2,11012,12000,SY1516,7/1/2017,6/30/2018,11012,Technology 602,602,Programming Level 2,Technology,6,Active 14 | 11013,10001,Physical Education 1,11013,12000,SY1516,7/1/2017,6/30/2018,11013,Gym 701,701,Phyical Education 1,Gym,7,Active 15 | 11014,10001,Physical Education 2,11014,12000,SY1516,7/1/2017,6/30/2018,11014,Gym 702,702,Physical Education 2,Gym,7,Active 16 | 11015,10002,Math - Algebra 1,11015,12000,SY1516,7/1/2017,6/30/2018,11015,Math 101,101,Algebra Level 1,Math,1,Active 17 | 11016,10002,English - Language 1,11016,12000,SY1516,7/1/2017,6/30/2018,11016,English 201,201,English Level 1,English,2,Active 18 | 11017,10002,History - World History 1,11017,12000,SY1516,7/1/2017,6/30/2018,11017,History 301,301,World History Level 1,History,3,Active 19 | 11018,10002,Science - Biology 1,11018,12000,SY1516,7/1/2017,6/30/2018,11018,Science 401,401,Biology Level 1,Science,4,Active 20 | 11019,10002,Health 1,11019,12000,SY1516,7/1/2017,6/30/2018,11019,Health 501,501,Health Level 1,Health,5,Active 21 | 11020,10002,Technology - Programming 1,11020,12000,SY1516,7/1/2017,6/30/2018,11020,Technology 601,601,Programming Level 1,Technology,6,Active 22 | 11021,10002,Physical Education 1,11021,12000,SY1516,7/1/2017,6/30/2018,11021,Gym 701,701,Phyical Education 1,Gym,7,Active 23 | 11022,10002,Math - Algebra 2,11022,12000,SY1516,7/1/2017,6/30/2018,11022,Math 102,102,Algebra Level 2,Math,1,Active 24 | 11023,10002,English - Language 2,11023,12000,SY1516,7/1/2017,6/30/2018,11023,English 202,202,English Level 2,English,2,Active 25 | 11024,10002,History - World History 2,11024,12000,SY1516,7/1/2017,6/30/2018,11024,History 302,302,World History Level 2,History,3,Active 26 | 11025,10002,Science - Biology 2,11025,12000,SY1516,7/1/2017,6/30/2018,11025,Science 402,402,Biology Level 2,Science,4,Active 27 | 11026,10002,Health 2,11026,12000,SY1516,7/1/2017,6/30/2018,11026,Health 502,502,Health Level 2,Health,5,Active 28 | 11027,10002,Technology - Programming 2,11027,12000,SY1516,7/1/2017,6/30/2018,11027,Technology 602,602,Programming Level 2,Technology,6,Active 29 | 11028,10002,Physical Education 2,11028,12000,SY1516,7/1/2017,6/30/2018,11028,Gym 702,702,Phyical Education 2,Gym,7,Active 30 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/100 Users/Teacher.csv: -------------------------------------------------------------------------------- 1 | ID,School DfE Number,First Name,Last Name,Username,Password,State ID,Teacher Number,Status,Middle Name,Secondary Email,Title,Qualification 2 | 14001,10001,Craig,Beane,CBeane,P@ssw0rd,WA,101,Active,James,,, 3 | 14002,10001,Daisy,Todd,DTodd,P@ssw0rd,WA,102,Active,Francis,,, 4 | 14003,10001,Dana,Mills,DMills,P@ssw0rd,WA,103,Active,Lynn,,, 5 | 14004,10001,Rocky,Jaime,RJaime,P@ssw0rd,WA,104,Active,Brandon,,, 6 | 14005,10001,Dolly,Wyatt,DWyatt,P@ssw0rd,WA,105,Active,Robert,,, 7 | 14006,10001,Kristie,Mitchell,KMitchell,P@ssw0rd,WA,106,Active,Timothy,,, 8 | 14007,10001,Felicia,Flowers,FFlowers,P@ssword,WA,107,Active,Lynn,,, 9 | 14008,10002,Hope,Todd,HTodd,P@ssword,WA,108,Active,Christopher,,, 10 | 14009,10002,Edna,Doyle,EDoyle,P@ssword,WA,109,Active,Bradley,,, 11 | 14010,10002,Shawna,Roy,SRoy,P@ssword,WA,110,Active,Brandon,,, 12 | 14011,10002,Tammie,Benton,TBenton,P@ssword,WA,111,Active,Robert,,, 13 | 14012,10002,Susana,Rocha,SRocha,P@ssword,WA,112,Active,Lynn,,, 14 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/100 Users/TeacherRoster.csv: -------------------------------------------------------------------------------- 1 | Section ID,ID 2 | 11001,14001 3 | 11002,14002 4 | 11003,14001 5 | 11004,14002 6 | 11005,14003 7 | 11006,14004 8 | 11007,14003 9 | 11008,14004 10 | 11009,14005 11 | 11010,14006 12 | 11011,14005 13 | 11012,14007 14 | 11013,14007 15 | 11014,14006 16 | 11015,14008 17 | 11016,14009 18 | 11017,14010 19 | 11018,14011 20 | 11019,14012 21 | 11020,14008 22 | 11021,14009 23 | 11022,14009 24 | 11023,14010 25 | 11024,14011 26 | 11025,14012 27 | 11026,14008 28 | 11027,14009 29 | 11028,14010 30 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/25 Users/School.csv: -------------------------------------------------------------------------------- 1 | DfE Number,Name,School Number,School NCES_ID,State ID,Grade Low,Grade High,Principal SIS ID,Principal Name,Principal Secondary Email,Address,City,State,Country,Postal Code,Phone,Zone 2 | 10001,Contoso High School,10001,1,WA,9,12,14007,Amy Roebuck,,2 Microsoft Way,Redmond,WA,US,98052,555-123-4567,1 3 | 10002,Fabrikam High School,10002,2,WA,9,12,14008,Harry James,,3 Microsoft Way,Redmond,WA,US,98052,555-987-6543,2 4 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/25 Users/Section.csv: -------------------------------------------------------------------------------- 1 | ID,School DfE Number,Section Name,Section Number,Term SIS ID,Term Name,Term StartDate,Term EndDate,Course SIS ID,Course Name,Course Number,Course Description,Course Subject,Periods,Status 2 | 11001,10001,Math - Algebra 1,11001,12000,SY1516,7/1/2017,6/30/2018,11001,Math 101,101,Algebra Level 1,Math,1,Active 3 | 11002,10001,Math - Algebra 2,11002,12000,SY1516,7/1/2017,6/30/2018,11002,Math 102,102,Algebra Level 2,Math,1,Active 4 | 11003,10001,English - Language 1,11003,12000,SY1516,7/1/2017,6/30/2018,11003,English 201,201,English Level 1,English,2,Active 5 | 11004,10001,English - Language 2,11004,12000,SY1516,7/1/2017,6/30/2018,11004,English 202,202,English Level 2,English,2,Active 6 | 11005,10001,History - World History 1,11005,12000,SY1516,7/1/2017,6/30/2018,11005,History 301,301,World History Level 1,History,3,Active 7 | 11006,10001,History - World History 2,11006,12000,SY1516,7/1/2017,6/30/2018,11006,History 302,302,World history Level 2,History,3,Active 8 | 11007,10001,Science - Biology 1,11007,12000,SY1516,7/1/2017,6/30/2018,11007,Science 401,401,Biology Level 1,Science,4,Active 9 | 11008,10001,Science - Biology 2,11008,12000,SY1516,7/1/2017,6/30/2018,11008,Science 402,402,Biology Level 2,Science,4,Active 10 | 11009,10001,Health 1,11009,12000,SY1516,7/1/2017,6/30/2018,11009,Health 501,501,Health Level 1,Health,5,Active 11 | 11010,10001,Health 2,11010,12000,SY1516,7/1/2017,6/30/2018,11010,Health 502,502,Health Level 2,Health,5,Active 12 | 11011,10001,Technology - Programming 1,11011,12000,SY1516,7/1/2017,6/30/2018,11011,Technology 601,601,Programming Level 1,Technology,6,Active 13 | 11012,10001,Technology - Programming 2,11012,12000,SY1516,7/1/2017,6/30/2018,11012,Technology 602,602,Programming Level 2,Technology,6,Active 14 | 11013,10001,Physical Education 1,11013,12000,SY1516,7/1/2017,6/30/2018,11013,Gym 701,701,Phyical Education 1,Gym,7,Active 15 | 11014,10001,Physical Education 2,11014,12000,SY1516,7/1/2017,6/30/2018,11014,Gym 702,702,Physical Education 2,Gym,7,Active 16 | 11015,10002,Math - Algebra 1,11015,12000,SY1516,7/1/2017,6/30/2018,11015,Math 101,101,Algebra Level 1,Math,1,Active 17 | 11016,10002,English - Language 1,11016,12000,SY1516,7/1/2017,6/30/2018,11016,English 201,201,English Level 1,English,2,Active 18 | 11017,10002,History - World History 1,11017,12000,SY1516,7/1/2017,6/30/2018,11017,History 301,301,World History Level 1,History,3,Active 19 | 11018,10002,Science - Biology 1,11018,12000,SY1516,7/1/2017,6/30/2018,11018,Science 401,401,Biology Level 1,Science,4,Active 20 | 11019,10002,Health 1,11019,12000,SY1516,7/1/2017,6/30/2018,11019,Health 501,501,Health Level 1,Health,5,Active 21 | 11020,10002,Technology - Programming 1,11020,12000,SY1516,7/1/2017,6/30/2018,11020,Technology 601,601,Programming Level 1,Technology,6,Active 22 | 11021,10002,Physical Education 1,11021,12000,SY1516,7/1/2017,6/30/2018,11021,Gym 701,701,Phyical Education 1,Gym,7,Active 23 | 11022,10002,Math - Algebra 2,11022,12000,SY1516,7/1/2017,6/30/2018,11022,Math 102,102,Algebra Level 2,Math,1,Active 24 | 11023,10002,English - Language 2,11023,12000,SY1516,7/1/2017,6/30/2018,11023,English 202,202,English Level 2,English,2,Active 25 | 11024,10002,History - World History 2,11024,12000,SY1516,7/1/2017,6/30/2018,11024,History 302,302,World History Level 2,History,3,Active 26 | 11025,10002,Science - Biology 2,11025,12000,SY1516,7/1/2017,6/30/2018,11025,Science 402,402,Biology Level 2,Science,4,Active 27 | 11026,10002,Health 2,11026,12000,SY1516,7/1/2017,6/30/2018,11026,Health 502,502,Health Level 2,Health,5,Active 28 | 11027,10002,Technology - Programming 2,11027,12000,SY1516,7/1/2017,6/30/2018,11027,Technology 602,602,Programming Level 2,Technology,6,Active 29 | 11028,10002,Physical Education 2,11028,12000,SY1516,7/1/2017,6/30/2018,11028,Gym 702,702,Phyical Education 2,Gym,7,Active 30 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/25 Users/Student.csv: -------------------------------------------------------------------------------- 1 | ID,School DfE Number,First Name,Last Name,Username,Password,State ID,Secondary Email,Student Number,Middle Name,Grade,Status,Birthdate,Graduation Year 2 | 13001,10001,Ora,Klein,OKlein,P@ssword,WA,,13001,Christopher,9,Active,4/2/2000,2019 3 | 13002,10001,Beulah,McMillan,BMcMillan,P@ssword,WA,,13002,Lynn,10,Active,11/12/1999,2018 4 | 13003,10001,Florence,Stark,FStark,P@ssword,WA,,13003,Brian,12,Active,12/19/1997,2016 5 | 13004,10001,Noah,Gilbertson,NGilbertson,P@ssword,WA,,13004,Daniel,9,Active,6/20/2000,2019 6 | 13005,10001,Erna,Parker,EParker,P@ssword,WA,,13005,Troy,11,Active,5/17/1998,2017 7 | 13006,10001,Sherry,Santana,SSantana,P@ssword,WA,,13006,Thomas,10,Active,8/22/1999,2018 8 | 13007,10001,Ronald,Lees,RLees,P@ssword,WA,,13012,Grace,9,Active,5/11/1998,2019 9 | 13008,10001,Latasha,Pratt,LPratt,P@ssword,WA,,13013,Christopher,11,Active,8/13/1999,2016 10 | 13009,10001,Misty,Thomas,MThomas,P@ssword,WA,,13014,Lynn,10,Active,7/6/2000,2017 11 | 13010,10001,Petra,Barlow,PBarlow,P@ssword,WA,,13015,Francis,9,Active,3/19/1997,2019 12 | 13011,10001,Bonnie,Hampton,PHampton,P@ssword,WA,,13016,Robert,12,Active,4/10/1998,2017 13 | 13012,10001,Dion,Matheson,DMatheson,P@ssword,WA,,13017,James,10,Active,5/17/1999,2017 14 | 13013,10001,Cesar,McCray,CMcCray,P@ssword,WA,,13018,Wilma,9,Active,2/17/2001,2020 15 | 13014,10001,Rickey,Cottle,Rcottle,P@ssword,WA,,13019,Forrest,10,Active,8/9/2000,2019 16 | 13015,10001,Fredrick,Markley,Fmarkley,P@ssword,WA,,13020,Noah,11,Active,6/17/1999,2018 17 | 13016,10001,Joshua,Bartels,Jbartels,P@ssword,WA,,13021,Tracy,9,Active,3/19/2001,2020 18 | 13017,10001,Maribel,Parsons,Mparsons,P@ssword,WA,,13022,Delmar,10,Active,3/10/2000,2019 19 | 13018,10001,Erma,Ballard,Eballard,P@ssword,WA,,13023,Maya,12,Active,4/3/1998,2017 20 | 13019,10001,Wilfred,Bevins,Wbevins,P@ssword,WA,,13024,Casey,9,Active,4/13/2001,2020 21 | 13020,10001,Rogelio,Cazares,Rcazares,P@ssword,WA,,13025,Hal,10,Active,2/1/2000,2019 22 | 13021,10001,Dixie,Morrison,Dmorrison,P@ssword,WA,,13026,Chris,11,Active,8/12/1999,2018 23 | 13022,10001,Williams,Bisson,Wbisson,P@ssword,WA,,13027,Roxanne,9,Active,3/6/2001,2020 24 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/25 Users/StudentEnrollment.csv: -------------------------------------------------------------------------------- 1 | Section ID,ID 2 | 11001,13001 3 | 11003,13001 4 | 11005,13001 5 | 11007,13001 6 | 11009,13001 7 | 11011,13001 8 | 11013,13001 9 | 11001,13002 10 | 11003,13002 11 | 11005,13002 12 | 11007,13002 13 | 11009,13002 14 | 11011,13002 15 | 11013,13002 16 | 11001,13003 17 | 11003,13003 18 | 11005,13003 19 | 11007,13003 20 | 11009,13003 21 | 11011,13003 22 | 11013,13003 23 | 11001,13004 24 | 11003,13004 25 | 11005,13004 26 | 11007,13004 27 | 11009,13004 28 | 11011,13004 29 | 11013,13004 30 | 11001,13005 31 | 11003,13005 32 | 11005,13005 33 | 11007,13005 34 | 11009,13005 35 | 11011,13005 36 | 11013,13005 37 | 11001,13006 38 | 11003,13006 39 | 11005,13006 40 | 11007,13006 41 | 11009,13006 42 | 11011,13006 43 | 11013,13006 44 | 11001,13007 45 | 11003,13007 46 | 11005,13007 47 | 11007,13007 48 | 11009,13007 49 | 11011,13007 50 | 11013,13007 51 | 11001,13008 52 | 11003,13008 53 | 11005,13008 54 | 11007,13008 55 | 11009,13008 56 | 11011,13008 57 | 11013,13008 58 | 11001,13009 59 | 11003,13009 60 | 11005,13009 61 | 11007,13009 62 | 11009,13009 63 | 11011,13009 64 | 11013,13009 65 | 11001,13010 66 | 11003,13010 67 | 11005,13010 68 | 11007,13010 69 | 11009,13010 70 | 11011,13010 71 | 11013,13010 72 | 11001,13011 73 | 11003,13011 74 | 11005,13011 75 | 11007,13011 76 | 11009,13011 77 | 11011,13011 78 | 11013,13011 79 | 11001,13012 80 | 11003,13012 81 | 11005,13012 82 | 11007,13012 83 | 11009,13012 84 | 11011,13012 85 | 11013,13012 86 | 11001,13013 87 | 11003,13013 88 | 11005,13013 89 | 11007,13013 90 | 11009,13013 91 | 11011,13013 92 | 11013,13013 93 | 11001,13014 94 | 11003,13014 95 | 11005,13014 96 | 11007,13014 97 | 11009,13014 98 | 11011,13014 99 | 11013,13014 100 | 11001,13015 101 | 11003,13015 102 | 11005,13015 103 | 11007,13015 104 | 11009,13015 105 | 11011,13015 106 | 11013,13015 107 | 11001,13016 108 | 11003,13016 109 | 11005,13016 110 | 11007,13016 111 | 11009,13016 112 | 11011,13016 113 | 11013,13016 114 | 11001,13017 115 | 11003,13017 116 | 11005,13017 117 | 11007,13017 118 | 11009,13017 119 | 11011,13017 120 | 11013,13017 121 | 11001,13018 122 | 11003,13018 123 | 11005,13018 124 | 11007,13018 125 | 11009,13018 126 | 11011,13018 127 | 11013,13018 128 | 11001,13019 129 | 11003,13019 130 | 11005,13019 131 | 11007,13019 132 | 11009,13019 133 | 11011,13019 134 | 11013,13019 135 | 11001,13020 136 | 11003,13020 137 | 11005,13020 138 | 11007,13020 139 | 11009,13020 140 | 11011,13020 141 | 11013,13020 142 | 11001,13021 143 | 11003,13021 144 | 11005,13021 145 | 11007,13021 146 | 11009,13021 147 | 11011,13021 148 | 11013,13021 149 | 11001,13022 150 | 11003,13022 151 | 11005,13022 152 | 11007,13022 153 | 11009,13022 154 | 11011,13022 155 | 11013,13022 156 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/25 Users/Teacher.csv: -------------------------------------------------------------------------------- 1 | ID,School DfE Number,First Name,Last Name,Username,Password,State ID,Teacher Number,Status,Middle Name,Secondary Email,Title,Qualification 2 | 14001,10001,Craig,Beane,CBeane,P@ssw0rd,WA,101,Active,James,,, 3 | 14002,10001,Daisy,Todd,DTodd,P@ssw0rd,WA,102,Active,Francis,,, 4 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/25 Users/TeacherRoster.csv: -------------------------------------------------------------------------------- 1 | Section ID,ID 2 | 11001,14001 3 | 11002,14002 4 | 11003,14001 5 | 11004,14002 6 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/Min Required Attributes/School.csv: -------------------------------------------------------------------------------- 1 | DfE Number,Name 2 | 10001,Contoso High School 3 | 10002,Fabrikam High School 4 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/Min Required Attributes/Section.csv: -------------------------------------------------------------------------------- 1 | ID,School DfE Number,Section Name 2 | 11001,10001,Math - Algebra 1 3 | 11002,10001,Math - Algebra 2 4 | 11003,10001,English - Language 1 5 | 11004,10001,English - Language 2 6 | 11005,10001,History - World History 1 7 | 11006,10001,History - World History 2 8 | 11007,10001,Science - Biology 1 9 | 11008,10001,Science - Biology 2 10 | 11009,10001,Health 1 11 | 11010,10001,Health 2 12 | 11011,10001,Technology - Programming 1 13 | 11012,10001,Technology - Programming 2 14 | 11013,10001,Physical Education 1 15 | 11014,10001,Physical Education 2 16 | 11015,10002,Math - Algebra 1 17 | 11016,10002,English - Language 1 18 | 11017,10002,History - World History 1 19 | 11018,10002,Science - Biology 1 20 | 11019,10002,Health 1 21 | 11020,10002,Technology - Programming 1 22 | 11021,10002,Physical Education 1 23 | 11022,10002,Math - Algebra 2 24 | 11023,10002,English - Language 2 25 | 11024,10002,History - World History 2 26 | 11025,10002,Science - Biology 2 27 | 11026,10002,Health 2 28 | 11027,10002,Technology - Programming 2 29 | 11028,10002,Physical Education 2 30 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/Min Required Attributes/Student.csv: -------------------------------------------------------------------------------- 1 | ID,School DfE Number,Username 2 | 13001,10001,OKlein 3 | 13002,10001,BMcMillan 4 | 13003,10001,FStark 5 | 13004,10001,NGilbertson 6 | 13005,10001,EParker 7 | 13006,10001,SSantana 8 | 13007,10001,RLees 9 | 13008,10001,LPratt 10 | 13009,10001,MThomas 11 | 13010,10001,PBarlow 12 | 13011,10001,PHampton 13 | 13012,10001,DMatheson 14 | 13013,10001,CMcCray 15 | 13014,10001,Rcottle 16 | 13015,10001,Fmarkley 17 | 13016,10001,Jbartels 18 | 13017,10001,Mparsons 19 | 13018,10001,Eballard 20 | 13019,10001,Wbevins 21 | 13020,10001,Rcazares 22 | 13021,10001,Dmorrison 23 | 13022,10001,Wbisson 24 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/Min Required Attributes/StudentEnrollment.csv: -------------------------------------------------------------------------------- 1 | Section ID,ID 2 | 11001,13001 3 | 11003,13001 4 | 11005,13001 5 | 11007,13001 6 | 11009,13001 7 | 11011,13001 8 | 11013,13001 9 | 11001,13002 10 | 11003,13002 11 | 11005,13002 12 | 11007,13002 13 | 11009,13002 14 | 11011,13002 15 | 11013,13002 16 | 11001,13003 17 | 11003,13003 18 | 11005,13003 19 | 11007,13003 20 | 11009,13003 21 | 11011,13003 22 | 11013,13003 23 | 11001,13004 24 | 11003,13004 25 | 11005,13004 26 | 11007,13004 27 | 11009,13004 28 | 11011,13004 29 | 11013,13004 30 | 11001,13005 31 | 11003,13005 32 | 11005,13005 33 | 11007,13005 34 | 11009,13005 35 | 11011,13005 36 | 11013,13005 37 | 11001,13006 38 | 11003,13006 39 | 11005,13006 40 | 11007,13006 41 | 11009,13006 42 | 11011,13006 43 | 11013,13006 44 | 11001,13007 45 | 11003,13007 46 | 11005,13007 47 | 11007,13007 48 | 11009,13007 49 | 11011,13007 50 | 11013,13007 51 | 11001,13008 52 | 11003,13008 53 | 11005,13008 54 | 11007,13008 55 | 11009,13008 56 | 11011,13008 57 | 11013,13008 58 | 11001,13009 59 | 11003,13009 60 | 11005,13009 61 | 11007,13009 62 | 11009,13009 63 | 11011,13009 64 | 11013,13009 65 | 11001,13010 66 | 11003,13010 67 | 11005,13010 68 | 11007,13010 69 | 11009,13010 70 | 11011,13010 71 | 11013,13010 72 | 11001,13011 73 | 11003,13011 74 | 11005,13011 75 | 11007,13011 76 | 11009,13011 77 | 11011,13011 78 | 11013,13011 79 | 11001,13012 80 | 11003,13012 81 | 11005,13012 82 | 11007,13012 83 | 11009,13012 84 | 11011,13012 85 | 11013,13012 86 | 11001,13013 87 | 11003,13013 88 | 11005,13013 89 | 11007,13013 90 | 11009,13013 91 | 11011,13013 92 | 11013,13013 93 | 11001,13014 94 | 11003,13014 95 | 11005,13014 96 | 11007,13014 97 | 11009,13014 98 | 11011,13014 99 | 11013,13014 100 | 11001,13015 101 | 11003,13015 102 | 11005,13015 103 | 11007,13015 104 | 11009,13015 105 | 11011,13015 106 | 11013,13015 107 | 11001,13016 108 | 11003,13016 109 | 11005,13016 110 | 11007,13016 111 | 11009,13016 112 | 11011,13016 113 | 11013,13016 114 | 11001,13017 115 | 11003,13017 116 | 11005,13017 117 | 11007,13017 118 | 11009,13017 119 | 11011,13017 120 | 11013,13017 121 | 11001,13018 122 | 11003,13018 123 | 11005,13018 124 | 11007,13018 125 | 11009,13018 126 | 11011,13018 127 | 11013,13018 128 | 11001,13019 129 | 11003,13019 130 | 11005,13019 131 | 11007,13019 132 | 11009,13019 133 | 11011,13019 134 | 11013,13019 135 | 11001,13020 136 | 11003,13020 137 | 11005,13020 138 | 11007,13020 139 | 11009,13020 140 | 11011,13020 141 | 11013,13020 142 | 11001,13021 143 | 11003,13021 144 | 11005,13021 145 | 11007,13021 146 | 11009,13021 147 | 11011,13021 148 | 11013,13021 149 | 11001,13022 150 | 11003,13022 151 | 11005,13022 152 | 11007,13022 153 | 11009,13022 154 | 11011,13022 155 | 11013,13022 156 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/Min Required Attributes/Teacher.csv: -------------------------------------------------------------------------------- 1 | ID,School DfE Number,Username 2 | 14001,10001,CBeane 3 | 14002,10001,DTodd 4 | -------------------------------------------------------------------------------- /CSV Samples/UK Format/Min Required Attributes/TeacherRoster.csv: -------------------------------------------------------------------------------- 1 | Section ID,ID 2 | 11001,14001 3 | 11002,14002 4 | 11003,14001 5 | 11004,14002 6 | -------------------------------------------------------------------------------- /CustomSolutions/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/Canvas_to_SDS_ADF_template.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/Canvas_to_SDS_ADF_template.json -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/add_trigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/add_trigger.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/deactivate_activity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/deactivate_activity.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/debug_dataFlow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/debug_dataFlow.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/main_pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/main_pipeline.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/new_alert_rule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/new_alert_rule.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/new_trigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/new_trigger.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/pipeline_run_results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/pipeline_run_results.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/run_pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/Canvas/img/run_pipeline.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/add_trigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/add_trigger.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/deactivate_activity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/deactivate_activity.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/debug_dataFlow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/debug_dataFlow.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/main_pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/main_pipeline.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/new_alert_rule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/new_alert_rule.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/new_trigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/new_trigger.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/pipeline_run_results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/pipeline_run_results.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/refcode_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/refcode_storage.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/run_pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/OneRoster/img/run_pipeline.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/add_trigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/add_trigger.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/deactivate_activity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/deactivate_activity.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/main_pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/main_pipeline.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/new_alert_rule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/new_alert_rule.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/new_trigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/new_trigger.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/pipeline_run_results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/pipeline_run_results.png -------------------------------------------------------------------------------- /CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/run_pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/SDS_ADF_ETL_Integrations/SchoologyCSV/img/run_pipeline.png -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/AzureBlob.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using log4net; 6 | using Microsoft.WindowsAzure.Storage; 7 | using Microsoft.WindowsAzure.Storage.Auth; 8 | using Microsoft.WindowsAzure.Storage.Blob; 9 | 10 | namespace DistributeTemplates 11 | { 12 | public class AzureBlob 13 | { 14 | private readonly string _containerName; 15 | private CloudBlobContainer _containerReference; 16 | 17 | private static readonly ILog Log = LogManager.GetLogger(typeof(AzureBlob)); 18 | 19 | public AzureBlob(string accountName, string accountKey, string containerName) 20 | { 21 | _containerName = containerName; 22 | 23 | var storageCredentials = new StorageCredentials(accountName, accountKey); 24 | var cloudStorageAccount = new CloudStorageAccount(storageCredentials, true); 25 | 26 | SetContainerReference(cloudStorageAccount); 27 | } 28 | 29 | private void SetContainerReference(CloudStorageAccount cloudStorageAccount) 30 | { 31 | var cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient(); 32 | _containerReference = cloudBlobClient.GetContainerReference(_containerName); 33 | _containerReference.CreateIfNotExists(); 34 | } 35 | 36 | public void UploadFile(string filename, byte[] contents) 37 | { 38 | var blobReference = _containerReference.GetBlockBlobReference(filename); 39 | blobReference.UploadFromByteArray(contents, 0, contents.Length); 40 | } 41 | 42 | public void RemoveAllFiles() 43 | { 44 | var blobs = _containerReference.ListBlobs(); 45 | foreach (var blockBlob in blobs.OfType()) 46 | { 47 | blockBlob.Delete(); 48 | } 49 | } 50 | 51 | public Uri GetUri(SharedAccessBlobPermissions permissions) 52 | { 53 | var policy = new SharedAccessBlobPolicy 54 | { 55 | SharedAccessExpiryTime = DateTime.UtcNow.AddDays(31.0), 56 | Permissions = permissions 57 | }; 58 | return new Uri(_containerReference.Uri, _containerReference.GetSharedAccessSignature(policy) + "&comp=list&restype=container"); 59 | } 60 | 61 | public ICollection ListFilenames() 62 | { 63 | var blobs = _containerReference.ListBlobs(); 64 | return blobs.OfType().Select(x => x.Name).ToList(); 65 | } 66 | 67 | public byte[] DownloadFile(string filename) 68 | { 69 | try 70 | { 71 | var blobReference = _containerReference.GetBlockBlobReference(filename); 72 | 73 | using (var memoryStream = new MemoryStream()) 74 | { 75 | blobReference.DownloadToStream(memoryStream); 76 | memoryStream.Position = 0; 77 | return memoryStream.ToArray(); 78 | } 79 | } 80 | catch (Exception ex) 81 | { 82 | Log.Error("Unexpected Exception while downloading file from Azure BLOB", ex); 83 | 84 | throw; 85 | } 86 | } 87 | } 88 | } -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/AzureCloudQueue.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using log4net; 4 | using Microsoft.WindowsAzure.Storage; 5 | using Microsoft.WindowsAzure.Storage.Auth; 6 | using Microsoft.WindowsAzure.Storage.Queue; 7 | using Newtonsoft.Json; 8 | 9 | namespace DistributeTemplates 10 | { 11 | public class AzureCloudQueue 12 | { 13 | private static readonly ILog Log = LogManager.GetLogger(typeof(AzureBlob)); 14 | 15 | private readonly string _queueName; 16 | 17 | private CloudQueue _queueReference; 18 | 19 | public AzureCloudQueue(string accountName, string accountKey, string queueName) 20 | { 21 | _queueName = queueName; 22 | 23 | var storageCredentials = new StorageCredentials(accountName, accountKey); 24 | var cloudStorageAccount = new CloudStorageAccount(storageCredentials, true); 25 | 26 | SetQueueReference(cloudStorageAccount); 27 | } 28 | 29 | private void SetQueueReference(CloudStorageAccount cloudStorageAccount) 30 | { 31 | try 32 | { 33 | var queueClient = cloudStorageAccount.CreateCloudQueueClient(); 34 | _queueReference = queueClient.GetQueueReference(_queueName); 35 | _queueReference.CreateIfNotExists(); 36 | } 37 | catch (Exception ex) 38 | { 39 | Log.Error("Unhandled Exception connecting to Azure Cloud Queue", ex); 40 | throw; 41 | } 42 | } 43 | 44 | public async Task GetMessageAsync() where T : class 45 | { 46 | try 47 | { 48 | var queueMessage = await _queueReference.GetMessageAsync(); 49 | if (queueMessage == null) 50 | { 51 | return null; 52 | } 53 | var message = JsonConvert.DeserializeObject(queueMessage.AsString); 54 | await _queueReference.DeleteMessageAsync(queueMessage); 55 | 56 | return message; 57 | } 58 | catch (Exception ex) 59 | { 60 | Log.Error("Unhandled Exception getting messages from the Azure Cloud Queue", ex); 61 | throw; 62 | } 63 | } 64 | 65 | public Uri GetUri(SharedAccessQueuePermissions permissions) 66 | { 67 | var policy = new SharedAccessQueuePolicy 68 | { 69 | SharedAccessExpiryTime = DateTime.UtcNow.AddDays(31.0), 70 | Permissions = permissions 71 | }; 72 | return new Uri(_queueReference.Uri, _queueReference.GetSharedAccessSignature(policy) + "&comp=list&restype=container"); 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/DistributeTemplates.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {D6C27B47-7E5E-419E-8437-A492548B9B01} 8 | Exe 9 | MigrationAPITEst 10 | MigrationAPITEst 11 | v4.7.2 12 | 512 13 | true 14 | true 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | DeploymentManifest.xsd 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | Designer 66 | 67 | 68 | 69 | 70 | 2.0.12 71 | 72 | 73 | 3.0.5 74 | 75 | 76 | 3.27.0 77 | 78 | 79 | 1.0.0-preview.0 80 | 81 | 82 | 16.1.21012.12000 83 | 84 | 85 | 9.3.3 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/DistributeTemplates.csproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | ShowAllFiles 5 | 6 | -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/Logger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Configuration; 4 | using System.Data.SqlClient; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | 9 | namespace DistributeTemplates 10 | { 11 | public class Logger 12 | { 13 | private SqlConnection dbConnect; 14 | private String sqlConnectionString; 15 | 16 | 17 | public Logger() 18 | { 19 | sqlConnectionString = ConfigurationManager.AppSettings["ConnectionString"].ToString(); 20 | } 21 | 22 | public void Log(String type, String teamid, String Message) 23 | { 24 | this.dbConnect = new SqlConnection(sqlConnectionString); 25 | dbConnect.Open(); 26 | 27 | System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand(); 28 | sqlCommand.Connection = dbConnect; 29 | 30 | sqlCommand.CommandText = "INSERT INTO dbo.Logs VALUES ('" + type + "','" + ConfigurationManager.AppSettings["AppName"].ToString() + "',null,'"+teamid+"','" + Message.Replace("'", "''") + "'); "; 31 | 32 | try 33 | { 34 | sqlCommand.ExecuteScalar(); 35 | } 36 | catch (SqlException) 37 | { 38 | 39 | } 40 | dbConnect.Close(); 41 | } 42 | 43 | 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/MigrationPackageFile.cs: -------------------------------------------------------------------------------- 1 | namespace DistributeTemplates 2 | { 3 | public class MigrationPackageFile 4 | { 5 | public string Filename { get; set; } 6 | 7 | public byte[] Contents { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("DistributeTemplates")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("DistributeTemplates")] 13 | [assembly: AssemblyCopyright("Copyright © 2021")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("d6c27b47-7e5e-419e-8437-a492548b9b01")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/SharePointMigrationTarget.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Configuration; 3 | using System.Security; 4 | using Microsoft.SharePoint.Client; 5 | 6 | namespace DistributeTemplates 7 | { 8 | public class SharePointMigrationTarget 9 | { 10 | private readonly Uri _tenantUrl; 11 | private readonly string _username; 12 | private readonly string _password; 13 | private ClientContext _client; 14 | public readonly string SiteName; 15 | public readonly string DocumentLibraryName; 16 | public readonly string Subfolder; 17 | 18 | public Guid DocumentLibraryId; 19 | public Guid WebId; 20 | public Guid RootFolderId; 21 | public Guid RootFolderParentId; 22 | 23 | public SharePointMigrationTarget(): this( 24 | new Uri(ConfigurationManager.AppSettings["SharePoint.TenantUrl"]), 25 | ConfigurationManager.AppSettings["SharePoint.SiteName"], 26 | ConfigurationManager.AppSettings["SharePoint.DocumentLibraryName"], 27 | ConfigurationManager.AppSettings["SharePoint.Subfolder"], 28 | ConfigurationManager.AppSettings["SharePoint.Username"], 29 | ConfigurationManager.AppSettings["SharePoint.Password"]) 30 | { 31 | } 32 | 33 | public SharePointMigrationTarget(Uri tenantUrl, string siteName, string documentLibraryName, string subfolder, string username, string password) 34 | { 35 | _tenantUrl = tenantUrl; 36 | SiteName = siteName; 37 | DocumentLibraryName = documentLibraryName; 38 | Subfolder = subfolder; 39 | _username = username; 40 | _password = password; 41 | 42 | Initialize(); 43 | } 44 | 45 | private void Initialize() 46 | { 47 | var securePassword = new SecureString(); 48 | foreach (var c in _password) securePassword.AppendChar(c); 49 | 50 | _client = new ClientContext($"{_tenantUrl}/{SiteName}/"); 51 | _client.Credentials = new SharePointOnlineCredentials(_username, securePassword); 52 | 53 | var documentLibrary = _client.Web.Lists.GetByTitle(DocumentLibraryName); 54 | _client.Load(documentLibrary, x => x.RootFolder); 55 | _client.ExecuteQuery(); 56 | var folder = documentLibrary.RootFolder; 57 | 58 | _client.Load(_client.Site, x => x.Id); 59 | _client.Load(_client.Web, x => x.Id); 60 | _client.Load(documentLibrary, x => x.Id); 61 | _client.Load(folder, x => x.UniqueId); 62 | _client.Load(folder, x => x.ParentFolder.UniqueId); 63 | 64 | _client.ExecuteQuery(); 65 | 66 | DocumentLibraryId = documentLibrary.Id; 67 | WebId = _client.Web.Id; 68 | RootFolderId = folder.UniqueId; 69 | RootFolderParentId = folder.ParentFolder.UniqueId; 70 | } 71 | 72 | public Guid StartMigrationJob(Uri sourceFileContainerUrl, Uri manifestContainerUrl, Uri azureQueueReportUrl) 73 | { 74 | var result = _client.Site.CreateMigrationJob(WebId , sourceFileContainerUrl.ToString(), manifestContainerUrl.ToString(), azureQueueReportUrl.ToString()); 75 | _client.ExecuteQuery(); 76 | return result.Value; 77 | } 78 | } 79 | } -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/SourceFile.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace DistributeTemplates 5 | { 6 | public class SourceFile 7 | { 8 | public SourceFile() 9 | { 10 | Properties = new Dictionary(); 11 | } 12 | 13 | public string Filename { get; set; } 14 | 15 | public DateTime LastModified { get; set; } 16 | 17 | public byte[] Contents { get; set; } 18 | 19 | public string Title { get; set; } 20 | 21 | public Dictionary Properties { get; set; } 22 | } 23 | } -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/TestDataProvider.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Reflection; 4 | using System.Text; 5 | using log4net; 6 | using Microsoft.WindowsAzure.Storage.Blob; 7 | 8 | namespace DistributeTemplates 9 | { 10 | public class TestDataProvider 11 | { 12 | private readonly AzureBlob _azureBlob; 13 | private readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 14 | 15 | public TestDataProvider(AzureBlob azureBlob) 16 | { 17 | _azureBlob = azureBlob; 18 | } 19 | 20 | public ICollection ProvisionAndGetFiles() 21 | { 22 | var testfiles = new[] 23 | { 24 | new SourceFile 25 | { 26 | Filename = "test.txt", 27 | LastModified = DateTime.Now, 28 | Contents = Encoding.UTF8.GetBytes("Hi, this is a test text-file"), 29 | Title = "Title of file 1" 30 | }, 31 | new SourceFile 32 | { 33 | Filename = "test2.txt", 34 | LastModified = DateTime.Now.AddDays(-1), 35 | Contents = Encoding.UTF8.GetBytes("Tesfile2"), 36 | Title = "Second title" 37 | } 38 | }; 39 | 40 | _log.Debug("Removing all existing files on test blob..."); 41 | _azureBlob.RemoveAllFiles(); 42 | 43 | _log.Debug($"Uploading {testfiles.Length} files on test blob..."); 44 | foreach (var testfile in testfiles) 45 | _azureBlob.UploadFile(testfile.Filename, testfile.Contents); 46 | 47 | return testfiles; 48 | } 49 | 50 | public Uri GetBlobUri() 51 | { 52 | return _azureBlob.GetUri(SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.List); 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/UpdateMessage.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace DistributeTemplates 4 | { 5 | public class UpdateMessage 6 | { 7 | public string Event { get; set; } 8 | public Guid JobId { get; set; } 9 | public DateTime? Time { get; set; } 10 | public string SiteId { get; set; } 11 | public string WebId { get; set; } 12 | public string DbId { get; set; } 13 | public string FarmId { get; set; } 14 | public string ServerId { get; set; } 15 | public string CorrelationId { get; set; } 16 | public string ErrorCode { get; set; } 17 | public string ErrorType { get; set; } 18 | public string Message { get; set; } 19 | public int? FilesCreated { get; set; } 20 | public int? BytesProcessed { get; set; } 21 | public string ObjectsProcessed { get; set; } 22 | public int? TotalErrors { get; set; } 23 | public int? TotalWarnings { get; set; } 24 | public string LastSpObjectId { get; set; } 25 | public string TotalExpectedSpObjects { get; set; } 26 | } 27 | } -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateExport/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/TeamTemplateExport/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateImport/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateImport/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateImport/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("TeamTemplateDistribution")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("TeamTemplateDistribution")] 13 | [assembly: AssemblyCopyright("Copyright © 2021")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("ecc1369a-6a0a-46c1-89f4-ead3b9d2ba39")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateImport/SQL Scripts/TeamsTemplates.Database.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/TeamTemplateImport/SQL Scripts/TeamsTemplates.Database.sql -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateImport/SQL Scripts/dbo.Courses.Table.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/TeamTemplateImport/SQL Scripts/dbo.Courses.Table.sql -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateImport/SQL Scripts/dbo.Logs.Table.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/TeamTemplateImport/SQL Scripts/dbo.Logs.Table.sql -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateImport/SQL Scripts/dbo.TemplateChannels.Table.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/TeamTemplateImport/SQL Scripts/dbo.TemplateChannels.Table.sql -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateImport/SQL Scripts/dbo.TemplateClassFiles.Table.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/TeamTemplateImport/SQL Scripts/dbo.TemplateClassFiles.Table.sql -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateImport/SQL Scripts/dbo.TemplateFiles.Table.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/TeamTemplateImport/SQL Scripts/dbo.TemplateFiles.Table.sql -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateImport/SQL Scripts/dbo.Templates.Table.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/CustomSolutions/TeamTemplateImport/SQL Scripts/dbo.Templates.Table.sql -------------------------------------------------------------------------------- /CustomSolutions/TeamTemplateImport/TeamTemplateImport.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {ECC1369A-6A0A-46C1-89F4-EAD3B9D2BA39} 8 | Exe 9 | TeamTemplateDistribution 10 | TeamTemplateDistribution 11 | v4.7.2 12 | 512 13 | true 14 | true 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 2.1.1 56 | 57 | 58 | 3.25.0 59 | 60 | 61 | 1.0.0-preview.6 62 | 63 | 64 | 7.0.0 65 | 66 | 67 | 5.2.8 68 | 69 | 70 | 4.3.0 71 | 72 | 73 | 9.3.3 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /CustomSolutions/readme: -------------------------------------------------------------------------------- 1 | 2 | Under Custom Solutions, we enter solutions created for customers that could benefit more Education Organizations. 3 | These solution are to be used as your own solutions and not as Microsoft services. Source code is available under the umbrella agreement of the O365-EDU-Tools. 4 | 5 | Solution TeamTemplateImport, this is the first part of the total solution for Team Templates. 6 | This part will take your source Team templates and download the files on a Azure Storage Account and store the structure into a SQL Azure. 7 | Please read the readme of the project more detailed instructions. 8 | 9 | Solution TeamTemplateExport, this is the second part of the total solution for Team Templates. 10 | This part will take your source Team templates that you downloaded into Azure blog and SQL and distribute the content into the target teams. 11 | Please read the readme of the project more detailed instructions. 12 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2017 - Microsoft Corporation 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /LTI Scripts/IdentifyingClassTeams.md: -------------------------------------------------------------------------------- 1 | # Identify Teams visualized by the Teams Classes LTI 2 | Teams created through the Canvas Teams sync, Blackboard Ultra Teams sync, D2L Course Connector for Class Teams, or connected to an LMS course using the Connect Teams UX have a specific extension property set that other Teams and underlying M365 Groups do not have. These special extension properties can be found on Group entity in Graph. 3 | 4 | ## Find 'Groups' visualized by the Teams LTI 5 | We will be using the [groups](https://docs.microsoft.com/en-us/graph/api/group-list?view=graph-rest-1.0&tabs=http) endpoint. A underlying M365 Group object exists for each Team, and when created by the LMS sync mechanisms the schemaExtension of _microsoft_EducationClassLmsExt_ is populated and the [LTI Context ID](https://www.imsglobal.org/spec/lti/v1p3/#lti-context-variable) that the LMS uses to identfy the course or section associated with the team is written in the ltiContextId property of that extension. 6 | 7 | _Microsoft_EducationClassLmsExt_ has several properties, not all of which are used, depending on your LMS: 8 | - ltiContextId (required) 9 | - lmsCourseId 10 | - lmsSectionId 11 | - lmsCourseName 12 | - lmsSectionName 13 | - lmsCourseSubject 14 | - lmsCourseDescription 15 | 16 | To identify groups created via LTI, we will filter looking for groups where ltiContextId is not blank. 17 | 18 | **Graph API Request**: 19 |
GET https://graph.microsoft.com/v1.0/groups?$count=true&$filter=microsoft_EducationClassLmsExt/ltiContextId ne null&$select=id,displayname,mail,microsoft_EducationClassLmsExt
20 | 21 | **Graph API Request headers** (_required_): `ConsistencyLevel:eventual` ([more info](https://docs.microsoft.com/en-us/graph/aad-advanced-queries?view=graph-rest-1.0&tabs=http)) 22 | 23 | **Graph Permissions Required**: `Directory.Read.All`, `Group.Read.All` 24 | 25 | **User/Application Context**: If using delegated permissions with a particular user context, the query will only return Groups that the user is a member of. If run as a Global Administrator, or with Admin consented context then all Groups meeting the criteria can be viewed. 26 | 27 | 28 | This will return the total count, and a list of all LMS associated groups including _id_, _displayName_, _mail_ (upn), and the _microsoft_EducationClassLmsExt_ extension properties. To see [more properties](https://docs.microsoft.com/en-us/graph/api/resources/group?view=graph-rest-1.0#properties), add them to the select statement in the request. 29 | 30 | More than likely, you will see an `@odata.nextLink` property at the beginning of the response. This means you are not getting a full list, and you will need to [page the data](https://docs.microsoft.com/en-us/graph/paging). 31 | 32 | -------------------------------------------------------------------------------- /LTI Scripts/IdentifyingOneDriveGroups.md: -------------------------------------------------------------------------------- 1 | Groups created to support the OneDrive LTI have a few specific property values that other Groups do not have. 2 | 3 | ## Find M365 Groups created by the OneDrive LTI 4 | We will be using the [groups](https://docs.microsoft.com/en-us/graph/api/group-list?view=graph-rest-1.0&tabs=http) endpoint. 5 | 6 | To identify groups created via the OneDrive LTI, we will filter looking for groups where the displayName starts with 'Course:' and the description contains the issuerName tag matching the name of the LMS. 7 | 8 | **Graph API Request**: 9 |
GET https://graph.microsoft.com/v1.0/groups?$count=true&$filter=startsWith(displayName,'Course:')&$search="description:issuerName: Canvas"&$select=id,displayName,email,description
10 | 11 | In the above API call you must replace **Canvas** with the issuerName of your LMS in the $search expression. Possible values for issuerName are: **Canvas**, **Schoology**, **Blackboard**, and **Generic**. These values are case sensitive. 12 | 13 | **Graph API Request headers** (_required_): `ConsistencyLevel:eventual` ([more info](https://docs.microsoft.com/en-us/graph/aad-advanced-queries?view=graph-rest-1.0&tabs=http)) 14 | 15 | **Graph Permissions Required**: `Directory.Read.All`, `Group.Read.All` 16 | 17 | **User/Application Context**: If using delegated permissions with a particular user context, the query will only return Groups that the user is a member of. If run as a Global Administrator, or with Admin consented context then all Groups meeting the criteria can be viewed. 18 | 19 | 20 | This will return the total count, and a list of all OneDrive LTI groups including _id_, _displayName_, _mail_ (upn), and _description_ properties. To return [additional property values](https://docs.microsoft.com/en-us/graph/api/resources/group?view=graph-rest-1.0#properties), add them to the comma delimited $select statement in the request. 21 | 22 | More than likely, you will see an `@odata.nextLink` property at the beginning of the response. This means you are not getting a full list, and you will need to [page the data](https://docs.microsoft.com/en-us/graph/paging). 23 | 24 | ### Powershell script example 25 | A [Powershell script example to log Groups](Get-OneDriveLTI-Groups.ps1) created by the OneDrive LTI is also available. 26 | 27 | -------------------------------------------------------------------------------- /LTI Scripts/README.md: -------------------------------------------------------------------------------- 1 | # Microsoft LMS Integration Resources 2 | 3 | All official LMS Integration documentation is located at https://docs.microsoft.com/en-us/microsoft-365/lti/ 4 | Anything in this repository is considered unofficial and should be used at your own risk. 5 | 6 | ## Graph API Resources 7 | Most guidance in this repository will involve calling the Microsoft Graph API. Graph API is how the Teams Meetings and Teams Classes LTIs work to create or modify meetings and Class Teams. It is usually necessary to use the Graph API to look up this same information. 8 | 9 | It is highly recommended that you familiarize yourself with the Microsoft Graph before reading the guidance in this repository. Please use the below resources: 10 | 11 | - [Microsoft Graph Overview](https://docs.microsoft.com/en-us/graph/overview) 12 | - [Using the Microsoft Graph API](https://docs.microsoft.com/en-us/graph/use-the-api) 13 | - [Explore Microsoft Graph - Microsoft Learn Course](https://docs.microsoft.com/en-us/learn/modules/microsoft-graph/) 14 | - [Graph Explorer - Test/Try Graph APIs](https://developer.microsoft.com/en-us/graph/graph-explorer) 15 | 16 | ## [Identify Class Teams visualized by the Teams Classes LTI](IdentifyingClassTeams.md) 17 | ## [Identify M365 Groups created by the Microsoft OneDrive LTI](IdentifyingOneDriveGroups.md) 18 | 19 | -------------------------------------------------------------------------------- /O365-EDU-Tools.yml: -------------------------------------------------------------------------------- 1 | page_type: sample 2 | products: 3 | - office-365 4 | languages: 5 | - powershell 6 | extensions: 7 | contentType: tools 8 | createdDate: '10/10/2016 3:12:09 PM' 9 | title: O365-EDU-Tools 10 | description: O365 Education tools and scripts repository 11 | -------------------------------------------------------------------------------- /OneRosterTools/PostmanCollection/OneRoster-CredentialsTemplate.postman_environment.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "57276c4f-c7cf-4ae9-a70c-901d8d64b58d", 3 | "name": "SDS-OneRoster--Template", 4 | "values": [ 5 | { 6 | "key": "OneRosterHost", 7 | "value": "Input Required", 8 | "enabled": true 9 | }, 10 | { 11 | "key": "Oauth2TokenAddress", 12 | "value": "Input Required for OAuth2", 13 | "enabled": true 14 | }, 15 | { 16 | "key": "OneRosterConsumerKey", 17 | "value": "Input Required", 18 | "enabled": true 19 | }, 20 | { 21 | "key": "OneRosterConsumerSecret", 22 | "value": "Input Required", 23 | "enabled": true 24 | }, 25 | { 26 | "key": "SchoolYear", 27 | "value": "Input Required", 28 | "enabled": true 29 | }, 30 | { 31 | "key": "DeltaDateTime", 32 | "value": "2020-01-01T01:00:00.000Z", 33 | "enabled": true 34 | }, 35 | { 36 | "key": "Scopes", 37 | "value": "Optional if using Scopes", 38 | "enabled": true 39 | }, 40 | { 41 | "key": "OAuth2AccessToken", 42 | "value": "Auto Generated", 43 | "enabled": true 44 | }, 45 | { 46 | "key": "OAuth2RefreshToken", 47 | "value": "Auto Generated", 48 | "enabled": true 49 | }, 50 | { 51 | "key": "school_id", 52 | "value": "Auto Generated", 53 | "enabled": true 54 | }, 55 | { 56 | "key": "class_id", 57 | "value": "Auto Generated", 58 | "enabled": true 59 | }, 60 | { 61 | "key": "student_id", 62 | "value": "Auto Generated", 63 | "enabled": true 64 | }, 65 | { 66 | "key": "teacher_id", 67 | "value": "Auto Generated", 68 | "enabled": true 69 | }, 70 | { 71 | "key": "term_id", 72 | "value": "Auto Generated", 73 | "enabled": true 74 | } 75 | ], 76 | "_postman_variable_scope": "environment", 77 | "_postman_exported_at": "2021-01-13T17:06:33.805Z", 78 | "_postman_exported_using": "Postman/7.36.1" 79 | } -------------------------------------------------------------------------------- /OneRosterTools/PostmanCollection/readme.md: -------------------------------------------------------------------------------- 1 | ## How to use the files in this directory? 2 | 3 | 1. Download and Install Postman tool if you don't already have it (https://www.getpostman.com) 4 | 2. Import the collection JSON file 5 | 3. Import the environment JSON file - This is a template environment for providing credetials required for connecting to OneRoster server. 6 | 4. Edit the environment file and provide required connection values to point to your OneRoster server. 7 | 5. Run the collection against the environment that you have setup in the previous step and ensure that all the tests have passed. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # O365-EDU-Tools 2 | O365 Education tools and scripts repository 3 | 4 | 5 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information, see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 6 | -------------------------------------------------------------------------------- /SDS Scripts/Archived/Add-Intune_Licenses.ps1: -------------------------------------------------------------------------------- 1 | 2 | <# 3 | Script Name: 4 | Add-Intune_Licenses.ps1 5 | 6 | Synopsis: 7 | This script is designed to get all users who don't have Intune for Education licenses currently, and adds them. No parameters are needed with this script, and you will see an output displayed on the screen for each user where the add is being attempted and subsequently processed. 8 | 9 | Syntax Examples and Options: 10 | .\Add-Intune_Licenses.ps1 11 | 12 | Written By: 13 | Bill Sluss 14 | 15 | Change Log: 16 | Version 1.0, 05/05/2017 - First Draft 17 | 18 | #> 19 | 20 | #Get the Intnue sku and set a string variable 21 | $sku = (get-msolaccountsku | ? {$_.accountskuid -match "INTUNE_EDU"}).accountskuid 22 | $sku2 = $sku.tostring() 23 | 24 | #Get all users that have the INTUNE_EDU sku applied 25 | $Users = Get-MsolUser -All | ? {$_.Licenses.AccountSkuId -notmatch "INTUNE_EDU"} 26 | 27 | #Add the Intune License for any users that dont currently have it 28 | Foreach ($User in $Users) { 29 | $upn = $User.UserPrincipalName 30 | Write-host -foregroundcolor green "Adding the Intune EDU license to $upn" 31 | Set-MsolUserLicense -UserPrincipalName $upn -AddLicenses $sku2 32 | } 33 | 34 | write-host -foregroundcolor green "script complete" 35 | -------------------------------------------------------------------------------- /SDS Scripts/Archived/Get-All_Users_With_and_Without_Classroom.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Get-All_Users_With_and_Without_Classroom.ps1 4 | 5 | Synopsis: 6 | This script is designed to export all users within an O365 tenant, and break them into 2 lists. Users with Classroom and User without Classroom. The result of this script will be 2 CSV files in the C:\temp directory. The first file is called users_with_classroom.csv, and a second file called users_without_classroom.csv. This script requires a powershell connection to Azure AD, before running this script. 7 | 8 | Syntax Examples and Options: 9 | .\Get-All_Users_With_and_Without_Classroom.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 12/05/2016 - First Draft 16 | #> 17 | 18 | #Create the arrays 19 | $HasClassroom = @() 20 | $NoClassroom = @() 21 | 22 | #Get All users in the tenant 23 | $Users = Get-Msoluser -all 24 | 25 | #Start the Foreach loop 26 | Foreach ($User in $Users) { 27 | 28 | #Set variables for each individual user 29 | $DN = $user.displayname 30 | $sku = (Get-msoluser -userprincipalname $user.userprincipalname).licenses.accountskuid 31 | 32 | #Get the user details if they have Classroom and add them to the HasClassroom export 33 | If ($sku -like "*CLASSDASH_Preview*"){ 34 | write-host -foregroundcolor green "$DN has the Classroom license" 35 | $HasClassroom += New-Object PsObject -Property @{ 36 | "Username"="$($User.DisplayName)"; 37 | "UPN"="$($User.UserPrincipalName)"; 38 | } 39 | } 40 | 41 | #Get the user details if they dont have Classroom and add them to the NoClassroom Export 42 | If ($sku -notlike "*CLASSDASH_Preview*"){ 43 | write-host -foregroundcolor red "$DN does not have the Classroom license" 44 | $NoClassroom += New-Object PsObject -Property @{ 45 | "Username"="$($User.DisplayName)"; 46 | "UPN"="$($User.UserPrincipalName)"; 47 | } 48 | } 49 | } 50 | 51 | #Export the results 52 | $HasClassroom | Export-CSV C:\temp\Users_with_classroom.csv -NoTypeInformation 53 | $NoClassroom | Export-CSV C:\temp\Users_without_classroom.csv -NoTypeInformation 54 | -------------------------------------------------------------------------------- /SDS Scripts/Archived/Remove-Intune_Licenses.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Remove-Intune_Licenses.ps1 4 | 5 | Synopsis: 6 | This script is designed to get all users who have Intune for Education licenses currently, and remove them. No parameters are needed with this script, and you will see an output displayed on the screen for each user where the removal is being attempted and subsequently processed. 7 | 8 | Syntax Examples and Options: 9 | .\Remove-Intune_Licenses.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 05/05/2017 - First Draft 16 | 17 | #> 18 | 19 | #Get the Intnue Sku and set a variable 20 | $sku = (get-msolaccountsku | ? {$_.accountskuid -match "INTUNE_EDU"}).accountskuid 21 | $sku2 = $sku.tostring() 22 | 23 | #Get all users that have the INTUNE_EDU sku applied 24 | $Users = Get-MsolUser -All | ? {$_.Licenses.AccountSkuId -match "INTUNE_EDU"} 25 | 26 | #Remove all Intune licenses from users that have them currently 27 | Foreach ($User in $Users) { 28 | $upn = $User.UserPrincipalName 29 | Write-host -foregroundcolor green "Removing the Intune EDU license from $upn" 30 | Set-MsolUserLicense -UserPrincipalName $upn -RemoveLicenses $sku2 31 | } 32 | 33 | write-host -foregroundcolor green "script complete" 34 | -------------------------------------------------------------------------------- /SDS Scripts/Archived/Set-Classroom_License_for_All_Users.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Set-Classroom_License_for_All_Users.ps1 4 | 5 | Synopsis: 6 | This script imports a list of users, and adds the Class Dashboard Preview license to each account in the csv. The users.csv must reside in the c:\temp directory, and be formatted as shown below. Only one column is needed, and should be populated with the UPN of the users you want to add license for. There are no switches or parameters needed to run this script. 7 | 8 | CSV Format: 9 | Userprincipalname 10 | user1@contoso.com 11 | user2@contoso.com 12 | user3@contoso.com 13 | 14 | Syntax Examples: 15 | .\Set-Classroom_License_for_All_Users.ps1 16 | 17 | Written By: 18 | Bill Sluss 19 | 20 | Change Log: 21 | Version 1.0, 12/06/2016 - First Draft 22 | 23 | #> 24 | 25 | #Get All Users 26 | $Users = Get-msoluser -all 27 | 28 | #Start a foreach loop 29 | Foreach ($User in $Users) { 30 | 31 | #Set UPN as a variable 32 | $upn = $user.userprincipalname 33 | 34 | #Set AccountSku as a variable 35 | $sku = (get-msolaccountsku | ? {$_.accountskuid -like "*CLASSDASH*"}).accountskuid 36 | 37 | #Set Usage Location 38 | Set-MsolUser -UserPrincipalName $upn -UsageLocation US 39 | 40 | #Write progress to the screen 41 | Write-Host -Foregroundcolor green "Adding Class Dashboard License to $upn" 42 | 43 | #Add the Classroom license 44 | Set-MsolUserLicense -UserPrincipalName $upn -addlicenses $sku -warningaction:silentlycontinue 45 | } 46 | 47 | write-host -foregroundcolor green "Script is Complete" 48 | write-host -foregroundcolor green "Below is a summary of the licenses applied. The Classroom license is the CLASSDASH_PREVIEW license listed" 49 | Get-MsolAccountSku 50 | -------------------------------------------------------------------------------- /SDS Scripts/Archived/Set-Classroom_License_for_Some_Users.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Set-Classroom_License_for_Some_Users.ps1 4 | 5 | Synopsis: 6 | This script imports a list of users, and adds the Class Dashboard Preview license to each account in the csv. The users.csv must reside in the c:\temp directory, be called Users.csv, and be formatted as shown below. Only one column is needed in the file. The header should be "UserPrincipalName" and each cell beneath it should be populated with the UPN of the users you want to add license for. There are no switches or parameters needed to run this script. 7 | 8 | CSV Format: 9 | Userprincipalname 10 | user1@contoso.com 11 | user2@contoso.com 12 | user3@contoso.com 13 | 14 | Syntax Examples: 15 | .\Set-Classroom_License_for_Some_Users.ps1 16 | 17 | Written By: 18 | Bill Sluss 19 | 20 | Change Log: 21 | Version 1.0, 12/06/2016 - First Draft 22 | 23 | #> 24 | 25 | #Import the List of Users 26 | $Users = Import-Csv c:\temp\Users.csv 27 | 28 | #Start a foreach loop 29 | Foreach ($User in $Users) { 30 | 31 | #Set UPN as a variable 32 | $upn = $user.userprincipalname 33 | 34 | #Set AccountSku as a variable 35 | $sku = (get-msolaccountsku | ? {$_.accountskuid -like "*CLASSDASH*"}).accountskuid 36 | 37 | #Set Usage Location 38 | Set-MsolUser -UserPrincipalName $upn -UsageLocation US 39 | 40 | #Write progress to the screen 41 | Write-Host -Foregroundcolor green "Adding Class Dashboard License to $upn" 42 | 43 | #Add the Classroom license 44 | Set-MsolUserLicense -UserPrincipalName $upn -addlicenses $sku -warningaction:silentlycontinue 45 | } 46 | 47 | write-host -foregroundcolor green "Script is Complete" 48 | write-host -foregroundcolor green "Below is a summary of the licenses applied. The Classroom license is the CLASSDASH_PREVIEW license listed" 49 | Get-MsolAccountSku 50 | 51 | -------------------------------------------------------------------------------- /SDS Scripts/Block Azure AD Portal/Block-AzureADPortal_for_everyone_except_a_list_of_admins.ps1: -------------------------------------------------------------------------------- 1 | #Connect to Azure AD and establish a session 2 | $session = Connect-AzureAD 3 | 4 | #set the ADIbizaUX App ID as a variable 5 | $appId = "74658136-14ec-4630-ad9b-26e160ff0fc6" 6 | 7 | #Ensure the service principal is present in the tenant, and if not add it 8 | $sp = Get-AzureADServicePrincipal -Filter "appId eq '$appId'" 9 | if (-not $sp) { 10 | $sp = New-AzureADServicePrincipal -AppId $appId 11 | } 12 | 13 | #Require user assignment for the PowerShell app 14 | Set-AzureADServicePrincipal -ObjectId $sp.ObjectId -AppRoleAssignmentRequired $true 15 | 16 | # Assign the default app role to each of the users in the CSV 17 | $admins = import-csv c:\temp\IntuneforEducationAdmins.csv 18 | Foreach ($admin in $admins) { 19 | $user = Get-AzureADUser -objectId $admin.userprincipalname 20 | New-AzureADServiceAppRoleAssignment -ObjectId $sp.ObjectId -ResourceId $sp.ObjectId -Id ([Guid]::Empty.ToString()) -PrincipalId $user.ObjectId 21 | } 22 | 23 | 24 | Write-host "Script Complete. Azure AD portal is now restricted." -------------------------------------------------------------------------------- /SDS Scripts/Block Azure AD Portal/Block-AzureADPortal_for_everyone_except_me.ps1: -------------------------------------------------------------------------------- 1 | #Connect to Azure AD and establish a session 2 | $session = Connect-AzureAD 3 | 4 | #set the ADIbizaUX App ID as a variable 5 | $appId = "74658136-14ec-4630-ad9b-26e160ff0fc6" 6 | 7 | #Ensure the service principal is present in the tenant, and if not add it 8 | $sp = Get-AzureADServicePrincipal -Filter "appId eq '$appId'" 9 | if (-not $sp) { 10 | $sp = New-AzureADServicePrincipal -AppId $appId 11 | } 12 | 13 | #Require an App Role Assignment for the Service Principal 14 | Set-AzureADServicePrincipal -ObjectId $sp.ObjectId -AppRoleAssignmentRequired $true 15 | 16 | # Assign the app role to the current user 17 | $me = Get-AzureADUser -ObjectId $session.Account.Id 18 | New-AzureADServiceAppRoleAssignment -ObjectId $sp.ObjectId -ResourceId $sp.ObjectId -Id ([Guid]::Empty.ToString()) -PrincipalId $me.ObjectId 19 | 20 | Write-host "Script Complete. Azure AD Portal is now restricted." -------------------------------------------------------------------------------- /SDS Scripts/Block Azure AD Portal/IntuneforEducationAdmins.csv: -------------------------------------------------------------------------------- 1 | userprincipalname 2 | john.smith@cdsync31.onmicrosoft.com 3 | cbeane@classrmtest31.org 4 | -------------------------------------------------------------------------------- /SDS Scripts/Block PowerShell/Block-MS_Graph_module_for_everyone_except_a_list_of_admins.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | This script is designed block use of Microsoft Graph PowerShell for all users except those included in an input csv file. 4 | 5 | .PARAMETER csvFilePath 6 | Location of the csv file with the UPNs of users to be excluded from being blocked from using the Microsoft Graph PowerShell. The header should be userprincipalname. See psadmins.csv in the current folder in the GitHub repo for an example. 7 | #> 8 | 9 | Param ( 10 | [Parameter(Mandatory=$true)] 11 | [string] $csvFilePath 12 | ) 13 | 14 | # Connect to Azure AD and establish a session 15 | $session = Connect-AzureAD 16 | 17 | # Set the 'Microsoft Graph PowerShell' Graph App ID as a variable 18 | $appId = "14d82eec-204b-4c2f-b7e8-296a70dab67e" 19 | 20 | # Ensure the service principal is present in the tenant, and if not add it 21 | $sp = Get-AzureADServicePrincipal -Filter "appId eq '$appId'" 22 | if (-not $sp) { 23 | $sp = New-AzureADServicePrincipal -AppId $appId 24 | } 25 | 26 | # Require user assignment for the Graph app 27 | Set-AzureADServicePrincipal -ObjectId $sp.ObjectId -AppRoleAssignmentRequired $true 28 | 29 | # Assign the default permissions to all admins in the CSV file list 30 | $admins = Import-Csv $csvFilePath 31 | Foreach ($admin in $admins) { 32 | $user = Get-AzureADUser -objectId $admin.userprincipalname 33 | New-AzureADServiceAppRoleAssignment -ObjectId $sp.ObjectId -ResourceId $sp.ObjectId -Id ([Guid]::Empty.ToString()) -PrincipalId $user.ObjectId 34 | } 35 | 36 | Write-host "Script Complete. PowerShell is now restricted." 37 | -------------------------------------------------------------------------------- /SDS Scripts/Block PowerShell/Block-MS_Graph_module_for_everyone_except_me.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | This script is designed block use of Microsoft Graph PowerShell for all users except who is running the script. 4 | #> 5 | 6 | # Connect to Azure AD and establish a session 7 | $session = Connect-AzureAD 8 | 9 | # Set the 'Microsoft Graph PowerShell' Graph App ID as a variable 10 | $appId = "14d82eec-204b-4c2f-b7e8-296a70dab67e" 11 | 12 | # Ensure the service principal is present in the tenant, and if not add it 13 | $sp = Get-AzureADServicePrincipal -Filter "appId eq '$appId'" 14 | if (-not $sp) { 15 | $sp = New-AzureADServicePrincipal -AppId $appId 16 | } 17 | 18 | # Require user assignment for the Graph app 19 | Set-AzureADServicePrincipal -ObjectId $sp.ObjectId -AppRoleAssignmentRequired $true 20 | 21 | # Assign the default app role (0-Guid) to the current user 22 | $me = Get-AzureADUser -ObjectId $session.Account.Id 23 | New-AzureADServiceAppRoleAssignment -ObjectId $sp.ObjectId -ResourceId $sp.ObjectId -Id ([Guid]::Empty.ToString()) -PrincipalId $me.ObjectId 24 | 25 | Write-host "Script Complete. PowerShell is now restricted." 26 | -------------------------------------------------------------------------------- /SDS Scripts/Block PowerShell/Block-PowerShell_for_everyone_except_a_list_of_admins.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | This script is designed block use of Azure Active Directory PowerShell for all users except those included in an input csv file. 4 | 5 | .PARAMETER csvFilePath 6 | Location of the csv file with the UPNs of users to be excluded from being blocked from using the Azure Active Directory PowerShell. The header should be userprincipalname. See psadmins.csv in the current folder in the GitHub repo for an example. 7 | #> 8 | 9 | Param ( 10 | [Parameter(Mandatory=$true)] 11 | [string] $csvFilePath 12 | ) 13 | 14 | # Connect to Azure AD and establish a session 15 | $session = Connect-AzureAD 16 | 17 | # Set the 'Azure Active Directory PowerShell' Graph App ID as a variable 18 | $appId = "1b730954-1685-4b74-9bfd-dac224a7b894" 19 | 20 | # Ensure the service principal is present in the tenant, and if not add it 21 | $sp = Get-AzureADServicePrincipal -Filter "appId eq '$appId'" 22 | if (-not $sp) { 23 | $sp = New-AzureADServicePrincipal -AppId $appId 24 | } 25 | 26 | # Require user assignment for the Graph app 27 | Set-AzureADServicePrincipal -ObjectId $sp.ObjectId -AppRoleAssignmentRequired $true 28 | 29 | # Assign the default permissions to all admins in the CSV file list 30 | $admins = import-csv $csvFilePath 31 | Foreach ($admin in $admins) { 32 | $user = Get-AzureADUser -objectId $admin.userprincipalname 33 | New-AzureADServiceAppRoleAssignment -ObjectId $sp.ObjectId -ResourceId $sp.ObjectId -Id ([Guid]::Empty.ToString()) -PrincipalId $user.ObjectId 34 | } 35 | 36 | Write-host "Script Complete. PowerShell is now restricted." 37 | -------------------------------------------------------------------------------- /SDS Scripts/Block PowerShell/Block-PowerShell_for_everyone_except_me.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | This script is designed block use of Azure Active Directory PowerShell for all users except who is running the script. 4 | #> 5 | 6 | # Connect to Azure AD and establish a session 7 | $session = Connect-AzureAD 8 | 9 | # Set the 'Azure Active Directory PowerShell' Graph App ID as a variable 10 | $appId = "1b730954-1685-4b74-9bfd-dac224a7b894" 11 | 12 | # Ensure the service principal is present in the tenant, and if not add it 13 | $sp = Get-AzureADServicePrincipal -Filter "appId eq '$appId'" 14 | if (-not $sp) { 15 | $sp = New-AzureADServicePrincipal -AppId $appId 16 | } 17 | 18 | # Assign the default app role (0-Guid) to the current user 19 | $me = Get-AzureADUser -ObjectId $session.Account.Id 20 | New-AzureADServiceAppRoleAssignment -ObjectId $sp.ObjectId -ResourceId $sp.ObjectId -Id ([Guid]::Empty.ToString()) -PrincipalId $me.ObjectId 21 | 22 | # Require user assignment for the Graph app 23 | Set-AzureADServicePrincipal -ObjectId $sp.ObjectId -AppRoleAssignmentRequired $true 24 | 25 | Write-host "Script Complete. PowerShell is now restricted." 26 | -------------------------------------------------------------------------------- /SDS Scripts/Block PowerShell/psadmins.csv: -------------------------------------------------------------------------------- 1 | userprincipalname 2 | billsluss@cdsync31.onmicrosoft.com 3 | cbeane@classrmtest31.org 4 | -------------------------------------------------------------------------------- /SDS Scripts/Connection Scripts/Connect-Azure_AD_V1.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Connect-Azure_AD_V2.ps1 4 | 5 | Synopsis: 6 | This script is designed to connect your PowerShell client to Azure AD using the V1 MSOnline module. This script requires you have already installed the Azure AD module for PowerShell. If you haven't, run the Install-AAD_Module_and_Sign_in_Assistant.ps1 included in this script repository. 7 | 8 | Syntax Examples: 9 | .\Connect-Azure_AD_V1.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 09/24/2018 - First Draft 16 | #> 17 | 18 | #Connect to AAD and ExO 19 | Write-Host -Foregroundcolor green "Enter your Office 365 Global Admin credentials in the authentication prompt!" 20 | $Cred = Get-Credential 21 | Connect-MsolService -credential $cred -------------------------------------------------------------------------------- /SDS Scripts/Connection Scripts/Connect-Azure_AD_V1_and_Exchange_Online.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Connect-Azure_AD_V1_and_Exchange_Online.ps1 4 | 5 | Synopsis: 6 | This script is designed to connect your PowerShell client to Azure AD and Exchange Online. This script requires you have already installed the Azure AD module for PowerShell. If you haven't, run the Install-AAD_Module_and_Sign_in_Assistant.ps1 included in this script repository. 7 | 8 | Syntax Examples: 9 | .\Connect-Azure_AD_V1_and_Exchange_Online.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 12/09/2016 - First Draft 16 | 17 | #> 18 | 19 | #Connect to AAD and ExO 20 | Write-Host -Foregroundcolor green "Enter your Office 365 Global Admin credentials in the authentication prompt!" 21 | $Cred = Get-Credential 22 | $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $Cred -Authentication Basic -AllowRedirection 23 | Import-PSSession $Session -allowclobber 24 | Connect-MsolService -credential $cred 25 | -------------------------------------------------------------------------------- /SDS Scripts/Connection Scripts/Connect-Azure_AD_V2.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Connect-Azure_AD_V2.ps1 4 | 5 | Synopsis: 6 | This script is designed to connect your PowerShell client to Azure AD using the V1 MSOnline module. This script requires you have already installed the Azure AD module for PowerShell. If you haven't, run the Install-AzureADModule.ps1 included in this script repository. 7 | 8 | Syntax Examples: 9 | .\Connect-Azure_AD_V2.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 09/24/2018 - First Draft 16 | #> 17 | 18 | #Connect to AAD and ExO 19 | Write-Host -Foregroundcolor green "Enter your Office 365 Global Admin credentials in the authentication prompt!" 20 | $Cred = Get-Credential 21 | Connect-AzureAD -credential $cred -------------------------------------------------------------------------------- /SDS Scripts/Connection Scripts/Connect-Exchange_Online.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Connect-Exchange_Online.ps1 4 | 5 | Synopsis: 6 | This script is designed to connect your PowerShell client to Exchange Online. 7 | 8 | Syntax Examples: 9 | .\Connect-Exchange_Online.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 12/09/2016 - First Draft 16 | #> 17 | 18 | #Connect to AAD and ExO 19 | Write-Host -Foregroundcolor green "Enter your Exchange Admin credentials in the authentication prompt!" 20 | $Cred = Get-Credential 21 | $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $Cred -Authentication Basic -AllowRedirection 22 | Import-PSSession $Session -allowclobber 23 | -------------------------------------------------------------------------------- /SDS Scripts/Connection Scripts/Connect-Microsoft_Teams.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Connect-MicrosoftTeams.ps1 4 | 5 | Synopsis: 6 | This script is designed to connect your PowerShell client to Azure AD using the V1 MSOnline module. This script requires you have already installed the Azure AD module for PowerShell. If you haven't, run the Install-AzureADModule.ps1 included in this script repository. 7 | 8 | Syntax Examples: 9 | .\Connect-Microsoft_Teams.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 09/24/2018 - First Draft 16 | #> 17 | 18 | #Connect to Microsoft Teams 19 | Write-Host -Foregroundcolor green "Enter your Office 365 Global Admin credentials in the authentication prompt!" 20 | $Cred = Get-Credential 21 | Connect-MicrosoftTeams -credential $cred -------------------------------------------------------------------------------- /SDS Scripts/Connection Scripts/Install-Azure_AD_V2.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Install-Azure_AD_V2.ps1 4 | 5 | Synopsis: 6 | This script is designed to install the Azure AD Preview Module for PowerShell. 7 | 8 | Syntax Examples: 9 | .\Install-Azure_AD_V2.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 09/24/2018 - First Draft 16 | #> 17 | 18 | #Connect to AAD and ExO 19 | Write-Host -Foregroundcolor green "Installing the AzureADPreview Module for PowerShell" 20 | Install-Module -Name AzureADPreview 21 | -------------------------------------------------------------------------------- /SDS Scripts/Connection Scripts/Install-Teams_Module.txt: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Install-Teams_Module.ps1 4 | 5 | Synopsis: 6 | This script is designed to install the Azure AD Preview Module for PowerShell. 7 | 8 | Syntax Examples: 9 | .\Install-Teams_Module.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 09/24/2018 - First Draft 16 | #> 17 | 18 | #Connect to AAD and ExO 19 | Write-Host -Foregroundcolor green "Installing the AzureADPreview Module for PowerShell" 20 | Install-Module -Name MicrosoftTeams 21 | -------------------------------------------------------------------------------- /SDS Scripts/Consent Scripts/Get-StudentsByLicense.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Get-StudentsByLicense.ps1 4 | 5 | Synopsis: 6 | This script is designed to export all stuents and their assigned licenses within an O365 tenant, to identify students from teachers based on the license assignment. The result of this script will be a CSV file exported to the c:\temp directory of the local machine, called students.csv. The output of this file can then be used to run the Set-MinorConsent.ps1 script. This script requires the AzureAD powershell module be installed and loaded, before running the script. 7 | 8 | Syntax Examples and Options: 9 | .\Get-StudentsByLicense.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 05/18/2018 - First Draft 16 | #> 17 | 18 | 19 | #Connect to Azure AD 20 | Write-Host "`n" 21 | Write-Host -ForegroundColor Green "Please enter your Global Administrator Username and Password" 22 | Write-Host "`n" 23 | Connect-AzureAD 24 | 25 | 26 | #Build the Assignments Array 27 | $Assignments = @() 28 | 29 | 30 | #Build the Student Sku Array 31 | $StudentSkus = @() 32 | $AllSkus = Get-AzureADSubscribedSku 33 | $StudentSkuIDs = ($AllSkus | ? {$_.skupartnumber -like "*student*"}).skuid 34 | Write-Host -ForegroundColor Green "The Student Skus identified are listed below:" 35 | Foreach ($Element in $StudentSkuIDs) { 36 | $SkuPart = (Get-AzureADSubscribedSku | ? {$_.SkuID -eq $Element}).SkuPartNumber 37 | Write-Host -ForegroundColor Green "SkuID ${Element} for License $SkuPart" 38 | } 39 | Write-Host "`n" 40 | 41 | 42 | #Get All User in AAD 43 | Write-Host -ForegroundColor Green "Getting All Users in Azure Active Directory with an assigned license" 44 | Write-Host "`n" 45 | $AllUsers = Get-AzureADUser -All $true | ? {$_.AssignedLicenses -ne $null} 46 | 47 | 48 | #Start foreach loop for all users with licenses 49 | Foreach ($User in $AllUsers) { 50 | $ObjectID = $User.ObjectID 51 | Write-host "`n" 52 | Write-Host -ForegroundColor Green "Getting Assigned Licenses for $DN" 53 | $GetUser = Get-AzureADUser -objectid $user.objectid 54 | $AssignedLicenses = ($GetUser | select -ExpandProperty assignedlicenses).skuid 55 | 56 | 57 | #Set Variables 58 | $UPN = $User.userprincipalname 59 | $DN = $User.Displayname 60 | $OBJ = $User.ObjectID 61 | $Age = $User.AgeGroup 62 | $Consent = $User.ConsentProvidedForMinor 63 | $Legal = $User.LegalAgeGroupClassification 64 | 65 | 66 | #Start foreach loop for all assigned skus 67 | Foreach ($License in $AssignedLicenses) { 68 | Write-host "$DN is assigned the SkuID $License" 69 | 70 | 71 | #Creating new PS Object for each Sku and adding to the array 72 | If ($StudentSkuIDs -contains $License) { 73 | $StudentObj = New-Object PSObject 74 | $StudentObj | Add-Member NoteProperty -Name UserPrincipalName -Value $UPN 75 | $StudentObj | Add-Member NoteProperty -Name DisplayName -Value $DN 76 | $StudentObj | Add-Member NoteProperty -Name ObjectID -Value $OBJ 77 | $StudentObj | Add-Member NoteProperty -Name SkuID -Value $License 78 | $StudentObj | Add-Member NoteProperty -Name AgeGroup -Value $Age 79 | $StudentObj | Add-Member NoteProperty -Name ConsentProvidedForMinor -Value $Consent 80 | $StudentObj | Add-Member NoteProperty -Name LegalAgeGroupClassification -Value $Legal 81 | $Assignments += $StudentObj 82 | } 83 | } 84 | } 85 | 86 | 87 | #Exporting the Assignments Array to CSV 88 | Write-Host "`n" 89 | Write-Host -ForegroundColor Green "Exporting the License Assignments to the c:\temp\Assignments.csv file" 90 | $Assignments | Export-CSV c:\temp\Students.csv -notype 91 | Write-Host "`n" 92 | Write-Host -ForegroundColor Green "Script is complete" 93 | Write-Host "`n" 94 | 95 | 96 | Write-Host -ForegroundColor Green "Confirm each SkuID listed in the csv file matches the Student SkuIDs shown below:" 97 | Foreach ($Element in $StudentSkuIDs) { 98 | $SkuPart = (Get-AzureADSubscribedSku | ? {$_.SkuID -eq $Element}).SkuPartNumber 99 | Write-Host -ForegroundColor Green "SkuID ${Element} for License $SkuPart" 100 | } 101 | Write-Host "`n" 102 | 103 | -------------------------------------------------------------------------------- /SDS Scripts/Consent Scripts/Set-MinorWithParentalConsent.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Set-MinorWithParentalConsent.ps1 4 | 5 | Synopsis: 6 | This script is designed to import the students listed in the students.csv which was exported from the Get-StudentsByLicense.ps1 script. Once imported, this script will set the AgeGroup and ConsentProvidedForMinor attributes. The net result of setting those two attributes is the attribute of LegalAgeGroupClassification set to MinorWithParentalConsent. This script requires the Azure AD V2 module for powershell be installed and loaded, before running this script. 7 | 8 | Syntax Examples and Options: 9 | .\Set-MinorWithParentalConsent.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 05/18/2018 - First Draft 16 | #> 17 | 18 | 19 | #Connect to Azure AD 20 | Write-Host -ForegroundColor Green "Please enter your Global Administrator Username and Password" 21 | Write-Host "`n" 22 | Connect-AzureAD 23 | 24 | 25 | #import the student.csv you just exported 26 | $Students = import-csv "c:\temp\students.csv" 27 | 28 | 29 | Foreach ($Student in $Students) { 30 | $OBJ = $Student.ObjectID 31 | $DN = $Student.DisplayName 32 | Write-Host -ForegroundColor Green "Setting attributes for $DN" 33 | Set-AzureADUser -objectID $OBJ -AgeGroup minor -ConsentProvidedForMinor granted 34 | } 35 | 36 | Write-Host "`n" 37 | Write-Host -ForegroundColor Green "Script Complete" 38 | 39 | Write-Host "`n" 40 | Write-Host -ForegroundColor Green "You can rerun the Get-StudentsByLicense.ps1 to confirm the attributes were set correctly." 41 | -------------------------------------------------------------------------------- /SDS Scripts/Email Restrictions/New-DDL_for_All_Admins.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | New-DDL_for_All_Admins.ps1 4 | 5 | Synopsis: 6 | This script is designed to create a Dynamic Distribution Group which includes all admins in the org. This DDL may be added to students mailboxes who implement the acceptance permissions, to allow these admins to email each of the respective students. This script assumes the Department attribute for admins contains the string "admin", and uses this attribute to populate and keep the DDL up to date. 7 | 8 | Syntax Examples and Options: 9 | .\New-DDL_for_All_Admins.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 12/14/2016 - First Draft 16 | 17 | #> 18 | 19 | New-DynamicDistributionGroup -Name All_Admins -IncludedRecipients AllRecipients -ConditionalDepartment Admin 20 | -------------------------------------------------------------------------------- /SDS Scripts/Email Restrictions/New-DDL_for_All_Students.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | New-DDL_for_All_Students.ps1 4 | 5 | Synopsis: 6 | This script is designed to create a Dynamic Distribution Group which includes all students in the org. This DDL may be added to students mailboxes who implement the acceptance permissions, to allow all students to email each other. This script assumes the Department attribute for students contains the string "Student", and uses this attribute to populate and keep the DDL up to date. 7 | 8 | Syntax Examples and Options: 9 | .\New-DDL_for_All_Students.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 12/14/2016 - First Draft 16 | 17 | #> 18 | 19 | New-DynamicDistributionGroup -Name All_Students -IncludedRecipients AllRecipients -ConditionalDepartment Student 20 | -------------------------------------------------------------------------------- /SDS Scripts/Email Restrictions/New-DDL_for_All_Teachers.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | New-DDL_for_All_Teachers.ps1 4 | 5 | Synopsis: 6 | This script is designed to create a Dynamic Distribution Group which includes all teachers in the org. This DDL may be added to students mailboxes who implement the acceptance permissions, to allow all students to email each other. This script assumes the Department attribute for teachers contains the string "Teacher", and uses this attribute to populate and keep the DDL up to date. 7 | 8 | Syntax Examples and Options: 9 | .\New-DDL_for_All_Teachers.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 12/14/2016 - First Draft 16 | 17 | #> 18 | 19 | New-DynamicDistributionGroup -Name All_Teachers -IncludedRecipients AllRecipients -ConditionalDepartment Teacher 20 | -------------------------------------------------------------------------------- /SDS Scripts/Email Restrictions/New-DDL_for_Students_by_Grade.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | New-DDL_for_Students_by_Grade.ps1 4 | 5 | Synopsis: 6 | This script is designed to create a Dynamic Distribution Group for each grade, which includes all students in that grade. These DDL's may be added to students mailboxes who implement the acceptance permissions, to allow a subset of students to email each other. This script assumes the Department attribute for admins contains the string associated to their individual grade (students in 1st grade will have a 1, student in second grade will have a 2, etc.), and uses this attribute to populate and keep each of the grade based DDL's up to date. 7 | 8 | Syntax Examples and Options: 9 | .\New-DDL_for_Students_by_Grade.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 12/14/2016 - First Draft 16 | 17 | #> 18 | 19 | New-DynamicDistributionGroup -Name Grade_1 -IncludedRecipients AllRecipients -ConditionalDepartment 1 20 | New-DynamicDistributionGroup -Name Grade_2 -IncludedRecipients AllRecipients -ConditionalDepartment 2 21 | New-DynamicDistributionGroup -Name Grade_3 -IncludedRecipients AllRecipients -ConditionalDepartment 3 22 | New-DynamicDistributionGroup -Name Grade_4 -IncludedRecipients AllRecipients -ConditionalDepartment 4 23 | New-DynamicDistributionGroup -Name Grade_5 -IncludedRecipients AllRecipients -ConditionalDepartment 5 24 | New-DynamicDistributionGroup -Name Grade_6 -IncludedRecipients AllRecipients -ConditionalDepartment 6 25 | New-DynamicDistributionGroup -Name Grade_7 -IncludedRecipients AllRecipients -ConditionalDepartment 7 26 | New-DynamicDistributionGroup -Name Grade_8 -IncludedRecipients AllRecipients -ConditionalDepartment 8 27 | New-DynamicDistributionGroup -Name Grade_9 -IncludedRecipients AllRecipients -ConditionalDepartment 9 28 | New-DynamicDistributionGroup -Name Grade_10 -IncludedRecipients AllRecipients -ConditionalDepartment 10 29 | New-DynamicDistributionGroup -Name Grade_11 -IncludedRecipients AllRecipients -ConditionalDepartment 11 30 | New-DynamicDistributionGroup -Name Grade_12 -IncludedRecipients AllRecipients -ConditionalDepartment 12 31 | New-DynamicDistributionGroup -Name Grade_K -IncludedRecipients AllRecipients -ConditionalDepartment k 32 | -------------------------------------------------------------------------------- /SDS Scripts/Email Restrictions/New-Transport_Rule_Inbound.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | New-Transport_Rule_Inbound.ps1 4 | 5 | Synopsis: 6 | This script is designed to create an inbound transport rule, to restrict all inbound email for a group or students from any sender outside of the O365 tenant. 7 | 8 | Syntax Examples and Options: 9 | .\New-Transport_Rule_Inbound.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 12/14/2016 - First Draft 16 | 17 | #> 18 | 19 | New-TransportRule -Name "Inbound Student Restrictions" -Enabled $true -FromScope NotInOrganization AnyOfToCcHeaderMemberOf All_Students -RejectMessageReasonText "Students are not allowed to receive messages from senders outside of the school district." 20 | -------------------------------------------------------------------------------- /SDS Scripts/Email Restrictions/New-Transport_Rule_Outbound.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | New-Transport_Rule_Outbound.ps1 4 | 5 | Synopsis: 6 | This script is designed to create an outbound transport rule, to restrict a set of students ability to send email outside of their respective O365 tenant. 7 | 8 | Syntax Examples and Options: 9 | .\New-Transport_Rule_Outbound.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 12/14/2016 - First Draft 16 | 17 | #> 18 | 19 | New-TransportRule -Name "Outbount Student Restrictions" -Enabled $true -FromMemberOF All_Students -SentToScope NotInOrganization -RejectMessageReasonText "Students are not allowed to send messages to recipients outside of the organization." 20 | -------------------------------------------------------------------------------- /SDS Scripts/Get-All_Sections.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | This script is designed to get all SDS sections, and export the default Azure AD attributes to a CSV files called Get-All_Sections.csv, into the c:\temp directory. No other object types are exported with this script. 4 | 5 | .EXAMPLE 6 | .\Get-All_Sections.ps1 7 | 8 | .NOTES 9 | ======================== 10 | Required Prerequisites 11 | ======================== 12 | 13 | 1. Install AzureAD Powershell Module with the command 'Install-Module AzureAD' (Recommend Windows PowerShell 5.x Module to be used for Azure AD powershell operations) 14 | 15 | 2. Check that you can connect to your tenant directory from the PowerShell module to make sure everything is set up correctly. 16 | 17 | a. Open a separate PowerShell session 18 | 19 | b. Execute: "Connect-AzureAD to bring up a sign-in UI. 20 | 21 | c. Sign in with any tenant administrator credentials 22 | 23 | d. If you are returned to the PowerShell session without error, you are correctly set up. 24 | 25 | 3. Retry this script. If you still get an error about failing to load the AzureAD module, troubleshoot why "Import-Module AzureAD" isn't working. 26 | #> 27 | 28 | Param( 29 | [string] $outFolder = ".\SDSSectionsExport" 30 | ) 31 | 32 | try 33 | { 34 | Import-Module AzureAD | Out-Null 35 | } 36 | catch 37 | { 38 | Write-Error "Failed to load AzureAD" 39 | Get-Help -Name .\Get-All_Sections.ps1 -Full | Out-String | Write-Error 40 | throw 41 | } 42 | 43 | Connect-AzureAD | Out-Null 44 | 45 | $fileName = "Get-All_Sections.csv" 46 | $csvFilePath = Join-Path $outFolder $fileName 47 | 48 | #Create output folder if it does not exist 49 | if ((Test-Path $outFolder) -eq 0) 50 | { 51 | mkdir $outFolder | Out-Null; 52 | } 53 | 54 | Remove-Item -Path $csvFilePath -Force -ErrorAction Ignore 55 | 56 | $output = @() 57 | 58 | Write-Progress -Activity "Reading AAD" -Status "Fetching SDS section groups" 59 | 60 | $groups = Get-AzureADGroup -All:$true | Select-Object -Property DisplayName, Mail, ObjectId, ProvisioningErrors | Where-Object {$_.Mail -like "Section_*"} 61 | 62 | $grpCtr = 0 63 | 64 | Foreach ($group in $groups) { 65 | 66 | #Grabbing error collection and joining into single column 67 | $grpErrs = $group | Select-Object -ExpandProperty ProvisioningErrors 68 | $grpErrJoin = $grpErrs -join "," 69 | 70 | #Create the PS Object 71 | $groupObj = New-Object PSObject 72 | 73 | #Add Members for Group Attributes 74 | $groupObj | Add-Member NoteProperty -Name DisplayName -Value $group.DisplayName 75 | $groupObj | Add-Member NoteProperty -Name EmailAddress -Value $group.Mail 76 | $groupObj | Add-Member NoteProperty -Name ObjectID -Value $group.ObjectId 77 | $groupObj | Add-Member NoteProperty -Name Errors -Value $grpErrJoin 78 | 79 | #Add All Member Attributes to PS Object 80 | $output += $groupObj 81 | 82 | $grpCtr++ 83 | Write-Progress -Activity "`nReading SDS section groups properties.." -Status "Progress ->" -PercentComplete ($grpCtr/$groups.count*100) 84 | } 85 | 86 | #Export the output array to CSV 87 | $output | Export-Csv $csvFilePath -NoTypeInformation 88 | 89 | Disconnect-AzureAD 90 | 91 | Write-host -ForegroundColor Green "Exported data to $csvFilePath. `nScript Complete." 92 | -------------------------------------------------------------------------------- /SDS Scripts/Get-User_Information_Barrier_Segments.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | 4 | Creates a csv with information barriers and organization segments for users in the tenant. 5 | 6 | .DESCRIPTION 7 | 8 | The script will connect to Exchange Online using Connect-IPPSSession and Connect-ExchangeOnline to get retrieve information barriers and corresponding organization segments for all users of the tenant. 9 | 10 | .INPUTS 11 | 12 | Folder location for csv output. $outFolder 13 | 14 | .OUTPUTS 15 | 16 | A folder location defined as an input will include a csv files of all outputs. 17 | 18 | .EXAMPLE 19 | 20 | PS> .\Get-User_Information_Barrier_Segments.ps1 21 | 22 | .NOTES 23 | 24 | The sequence of loading both modules is significant. Load the IPPSSession before ExchangeOnline modules 25 | 26 | ======================== 27 | Required Prerequisites 28 | ======================== 29 | 30 | 1. Install current PowerShell version. 31 | 32 | 2. Install the Exchange Online Management Module with command 'Install-Module ExchangeOnlineManagement' 33 | 34 | 2. Check that you can connect to your tenant directory from the PowerShell module to make sure everything is set up correctly. 35 | 36 | a. Open a separate PowerShell session 37 | 38 | c. Type "Connect-IPPSSession"; "Connect-ExchangeOnline" 39 | 40 | d. Sign in with any tenant administrator credentials. 41 | 42 | d. If you are returned to the PowerShell session without error, you are correctly set up 43 | 44 | 3. Retry this script. If you still get an error about failing to load the Exchange Online Management module, troubleshoot why 'Install-Module ExchangeOnlineManagement' isn't working. 45 | #> 46 | 47 | $outFolder = "C:\temp\" 48 | $csvFilePath = "$outFolder\UserInformationBarrierSegments.csv" 49 | 50 | #Create the output array 51 | $outputArray = @() 52 | 53 | #Check to see if outFolder exists, and if not create it 54 | if(!(Test-Path $outFolder)) { 55 | New-Item -ItemType Directory -Force -Path $outFolder 56 | } 57 | 58 | #Remove temp csv file 59 | if ((Test-Path $csvFilePath)) 60 | { 61 | Remove-Item $csvFilePath; 62 | } 63 | 64 | #Connection to IB info 65 | Connect-IPPSSession 66 | 67 | $orgSegments = Get-OrganizationSegment | Select-Object Name, Guid, ExoSegmentId 68 | 69 | Disconnect-ExchangeOnline -Confirm:$false | Out-Null 70 | 71 | #Connection to fetch user info 72 | Connect-ExchangeOnline 73 | 74 | #Note: Even though Connect-IPPSSession shares the Get-User cmdlet, InformationBarrierSegments is returned when using Connect-ExchangeOnline 75 | $users = Get-User -ResultSize Unlimited -Filter 'InformationBarrierSegments -ne $null' | Select-Object DisplayName, UserPrincipalName, InformationBarrierSegments, Guid 76 | 77 | $userCtr = 0 78 | 79 | #Start foreach loop 80 | foreach($user in $users) { 81 | 82 | #Set variables 83 | $dn = $user.DisplayName 84 | $upn = $user.UserPrincipalName 85 | $ibs = $user.InformationBarrierSegments 86 | $guid = $user.Guid 87 | $segmentNames = @() 88 | 89 | foreach($segment in $ibs){ 90 | $segmentNames += ($orgSegments | Where-Object{$_.ExoSegmentId -eq $segment}).Name 91 | } 92 | 93 | #Create the PS Object 94 | $userObj = New-Object PSObject 95 | 96 | #Add each member attribute to the person's PS Object 97 | $userObj | Add-Member NoteProperty -Name DisplayName -Value $dn 98 | $userObj | Add-Member NoteProperty -Name UPN -Value $upn 99 | $userObj | Add-Member NoteProperty -Name ObjectID -Value $guid 100 | $userObj | Add-Member NoteProperty -Name InformationBarriers -Value (Join-String -Separator ", " -InputObject $ibs) 101 | $userObj | Add-Member NoteProperty -Name IBNames -Value (Join-String -Separator ", " -InputObject $segmentNames) 102 | 103 | #Add this persons PS Object to the output array 104 | $outputArray += $userObj 105 | $userCtr++ 106 | 107 | Write-Progress -Activity "`nGetting information barrier segments for users" -Status "Progress ->" -PercentComplete ($userCtr/$users.count*100) 108 | } 109 | 110 | #Export the output array to a CSV file in local outFolder directory 111 | $outputArray | Export-csv $csvFilePath -NoTypeInformation 112 | 113 | Write-Host -ForegroundColor Green "`n`nDone. Please run and 'Disconnect-ExchangeOnline' and disconnect from both sessions if you are finished`n" -------------------------------------------------------------------------------- /SDS Scripts/Remove-All_Sections.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Remove-All_Sections.ps1 4 | 5 | Synopsis: 6 | This script is designed to Remove all Sections created by SDS from an O365 tenant. 7 | This script requires a PowerShell connection to Azure AD using Connect-AzureAd cmdlet. 8 | Help: https://docs.microsoft.com/en-us/powershell/azure/active-directory/install-adv2?view=azureadps-2.0#connect-to-azure-ad 9 | 10 | Syntax Examples and Options: 11 | .\Remove-All_Sections.ps1 12 | 13 | Written By: 14 | Bill Sluss 15 | 16 | Change Log: 17 | Version 1.0, 12/12/2016 - First Draft 18 | Version 1.1, 08/01/2017 - Update to Soft Delete groups (Varun Menasina Chidananda) 19 | #> 20 | 21 | $logFilePath = "./remove-all-sections.log" 22 | $softDeletePrefix = "SoftDeleted_" 23 | Echo "Starting script to remove all groups at $([System.DateTime]::UtcNow)" | Out-File $logFilePath -Append 24 | 25 | #Get all O365 Groups in a tenant with mail nickname starting with "Section_" 26 | $Groups = Get-AzureADGroup -All $true | ? {$_.MailNickName -like "*Section_*"} 27 | 28 | Foreach ($Group in $Groups) { 29 | #Update group properties and delete 30 | $DifferentiatorSuffix = Get-Random -Minimum 100 -Maximum 999 31 | $NewDisplayName = $softDeletePrefix + $Group.DisplayName 32 | $NewMailNickName = $softDeletePrefix + $Group.MailNickName + $DifferentiatorSuffix 33 | 34 | $Log = "Soft deleting group $($Group.ObjectID) - [$($Group.MailNickName) / $($NewMailNickName)] - [$($Group.DisplayName) / $NewDisplayName]" 35 | Echo $Log | Out-File $logFilePath -Append 36 | Write-Host -ForegroundColor green "Removing Group $($Group.DisplayName)" 37 | 38 | Set-AzureADGroup -ObjectId $Group.ObjectID -MailNickName $NewMailNickName -DisplayName $NewDisplayName -ErrorAction Stop 39 | Remove-AzureADGroup -ObjectId $Group.ObjectID -ErrorAction Stop 40 | } 41 | 42 | Echo "Finished removing $($Groups.Count) Sections at $([System.DateTime]::UtcNow)" | Out-File $logFilePath -Append 43 | Write-host -ForegroundColor Green "Script Complete. Log: $logFilePath `n" 44 | -------------------------------------------------------------------------------- /SDS Scripts/Remove-Expired_Section_Memberships.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Remove-Expired_Section_Memberships.ps1 4 | 5 | Synopsis: 6 | This script is designed to get all SDS classes that have been marked Expired, and remove their members. All Expired classes and removals are displayed on screen. 7 | 8 | Syntax Examples and Options: 9 | .\Remove-Expired_Section_Memberships.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 8/08/206 - First Draft 16 | #> 17 | 18 | Connect-AzureAD 19 | $Groups = Get-AzureADGroup -All:$true | Where-Object {$_.DisplayName -match '^Exp[0-9]{4}'} 20 | $Count = $Groups.count 21 | Write-host -ForegroundColor Green "Found $Count Classes Marked Expired. Starting Cleanup - Remove Members" 22 | 23 | Foreach ($Group in $Groups) { 24 | $Obj = $Group.objectID 25 | $DN = $Group.DisplayName 26 | Write-host "Removing Members of $DN" 27 | $Members = Get-AzureADGroupMember -ObjectID $Obj 28 | 29 | Foreach ($Member in $Members) { 30 | $MemID = $Member.ObjectID 31 | $MemName = $member.DisplayName 32 | Write-host -ForegroundColor Green "Removing $MemName from $DN" 33 | Remove-AzureADGroupMember -MemberId $MemID -ObjectId $Obj 34 | } 35 | } 36 | 37 | #Export the output array to CSV 38 | Write-host -ForegroundColor Green "Script Complete" 39 | -------------------------------------------------------------------------------- /SDS Scripts/Remove-Expired_Sections.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Remove-Expired_Sections.ps1 4 | 5 | Synopsis: 6 | This script is designed to get all SDS classes that have been marked Expired, and remove them from AAD. All Expired class removals are displayed on screen. 7 | 8 | Syntax Examples and Options: 9 | .\Remove-Expired_Sections.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 8/9/2018 - First Draft 16 | #> 17 | 18 | Connect-AzureAD 19 | $Groups = Get-AzureADGroup -All:$true | ? {$_.DisplayName -like "Exp*"} 20 | $Count = $Groups.count 21 | Write-host -ForegroundColor Green "Found $Count Classes Marked Expired. Starting Cleanup - Remove Sections" 22 | 23 | Foreach ($Group in $Groups) { 24 | $Obj = $Group.objectID 25 | $DN = $Group.DisplayName 26 | Write-host -ForegroundColor Green "Removing $DN" 27 | Remove-AzureADGroup -ObjectID $Obj 28 | } 29 | 30 | #Export the output array to CSV 31 | Write-host -ForegroundColor Green "Script Complete" 32 | -------------------------------------------------------------------------------- /SDS Scripts/Remove-Student_Attributes.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .Synopsis 3 | This script is designed to get all SDS students, and removes all recently deprecated student attributes. No other object types or attributes are modified with this script. 4 | 5 | .Example 6 | .\Remove-Student_Attributes.ps1 7 | #> 8 | 9 | #Connect to Azure AD 10 | Connect-AzureAD 11 | 12 | $ExtID = "73eb1ff2-0bb6-4d2f-9944-3414b1906869" 13 | 14 | #Get all users in the tenant 15 | $Users = Get-AzureADUser -All:$true 16 | 17 | #Start Foreach Loop 18 | ForEach ($User in $Users) { 19 | #Set Variables 20 | $DN = $User.DisplayName 21 | $Ext = $User | Select-Object -ExpandProperty ExtensionProperty 22 | 23 | #Determine if Student 24 | if ($Ext.extension_fe2174665583431c953114ff7268b7b3_Education_ObjectType -like "Student") { 25 | 26 | #Let the Admin know Student was found for processing 27 | write-host -ForegroundColor green "Removing Sensitive Attributes for $DN" 28 | 29 | #Remove each of the deprecated attributes 30 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_Gender 31 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_ResidenceCountry 32 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_ResidenceZip 33 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_ResidenceState 34 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_ResidenceCity 35 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_ResidenceAddress 36 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_MailingCountry 37 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_MailingZip 38 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_MailingState 39 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_MailingCity 40 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_MailingAddress 41 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_FederalRace 42 | Remove-AzureADUserExtension -ObjectId $ExtID -ExtensionName extension_fe2174665583431c953114ff7268b7b3_Education_EnglishLanguageLearnersStatus 43 | } 44 | } 45 | 46 | write-host -ForegroundColor green "Script Complete" -------------------------------------------------------------------------------- /SDS Scripts/Remove-Unused_Sections.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | 3 | Script Name: 4 | Remove-Sections.ps1 5 | 6 | Synopsis: 7 | This script is designed to Remove unused Sections created by SDS from an O365 tenant, based on the usage report SDS generates. This script requires a PowerShell connection to Azure AD before executing. 8 | Required PowerShell Module: https://docs.microsoft.com/en-us/powershell/azure/active-directory/install-adv2?view=azureadps-2.0 9 | 10 | Syntax Examples and Options: 11 | .\Remove-Sections.ps1 -SectionUsageReport "C:\SectionUsage.csv" 12 | 13 | Written By: 14 | Mihir Patel 15 | 16 | Change Log: 17 | Version 1.0, 06/19/2017 - First Draft 18 | Version 1.1, 08/01/2017 - Update to Soft Delete groups (Varun Menasina Chidananda) 19 | #> 20 | 21 | [CmdletBinding()] 22 | 23 | Param ([Parameter(Mandatory = $true, ValueFromPipeline = $true)] [string]$SectionUsageReport) 24 | 25 | #Connect 26 | Connect-AzureAD 27 | 28 | #Read Section Ids from the CSV file 29 | $SectionInfo = Import-Csv $SectionUsageReport 30 | $GroupIds = $SectionInfo | ? { $_."Usage.HasFiles" -eq "FALSE" } | % { $_.GraphId } 31 | 32 | $logFilePath = "./remove-unused-sections.log" 33 | $softDeletePrefix = "SoftDeleted_" 34 | Echo "Starting script to remove all groups at $([System.DateTime]::UtcNow)" | Out-File $logFilePath -Append 35 | 36 | #Start Foreach loop 37 | Foreach ($GroupId in $GroupIds) { 38 | #Get the O365 Group 39 | $Group = Get-AzureADGroup -ObjectId $GroupId 40 | 41 | #Update group properties and delete 42 | $DifferentiatorSuffix = Get-Random -Minimum 100 -Maximum 999 43 | $NewDisplayName = $softDeletePrefix + $Group.DisplayName 44 | $NewMailNickName = $softDeletePrefix + $Group.MailNickName + $DifferentiatorSuffix 45 | 46 | $Log = "Soft deleting group $($Group.ObjectID) - [$($Group.MailNickName) / $($NewMailNickName)] - [$($Group.DisplayName) / $NewDisplayName]" 47 | Echo $Log | Out-File $logFilePath -Append 48 | Write-Host -ForegroundColor green "Removing Group $($Group.DisplayName)" 49 | 50 | Set-AzureADGroup -ObjectId $Group.ObjectID -MailNickName $NewMailNickName -DisplayName $NewDisplayName -ErrorAction Stop 51 | Remove-AzureADGroup -ObjectId $Group.ObjectID -ErrorAction Stop 52 | } 53 | 54 | #Script is complete 55 | Echo "Finished removing $($GroupIds.Count) Sections at $([System.DateTime]::UtcNow)" | Out-File $logFilePath -Append 56 | Write-host -ForegroundColor Green "Script Complete. Log: $logFilePath `n" 57 | -------------------------------------------------------------------------------- /SDS Scripts/Set-All_Sections_as_Hidden.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Set-All_Sections_as_Hidden.ps1 4 | 5 | Synopsis: 6 | This script is designed to connect to Azure AD and Exchange Online, get all SDS sections potentially in the GAL, and sets the Hidden From Address Lists parameter to true. 7 | 8 | Syntax Examples and Options: 9 | .\Set-All_Sections_as_Hidden.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 12/08/2016 - First Draft 16 | 17 | #> 18 | 19 | #Connect to Azure and Exchange Online 20 | $Cred = Get-Credential 21 | $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $Cred -Authentication Basic -AllowRedirection 22 | Import-PSSession $Session 23 | Connect-MsolService -credential $cred 24 | 25 | #Get All Sections potentially in the GAL 26 | $Sections = Get-UnifiedGroup –ResultSize Unlimited | ? {$_.Name –like “Section_*”} 27 | 28 | #Run Foreach loop against each section 29 | Foreach ($Section in $Sections) { 30 | 31 | #Tag the variable for use in the set cmd 32 | $Addr = $Section.PrimarySmtpAddress 33 | $DN = $Section.Displayname 34 | 35 | #Write Progress 36 | Write-Host -foregroundcolor green "Setting hidden attribute on group $DN" 37 | 38 | #Set the group as hidden 39 | Set-UnifiedGroup -Identity $Addr -HiddenFromAddressListsEnabled $true -warningaction:silentlycontinue 40 | } 41 | 42 | Write-Host -foregroundcolor green "Script Complete" 43 | -------------------------------------------------------------------------------- /SDS Scripts/Set-Email_Addresses_Expired.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | 3 | Script Name: 4 | Set-Email_Addresses_Expired.ps1 5 | 6 | Synopsis: 7 | This script is designed to get all classes in Exchange Online which have been Marked Expired by SDS. Each of these classes will have their primarySMTPAddress updated with the mailnickname attribute, which is appended with "Expmmyy_". Once the update is complete, PowerShell will generate a report in the c:\temp directory which details every expired class, and the currently set displayname and primary email address. 8 | 9 | Syntax Examples and Options: 10 | .\Set-Email_Addresses_Expired.ps1 11 | 12 | Written By: 13 | Bill Sluss 14 | 15 | Change Log: 16 | Version 1.0, 8/6/2018 - First Draft 17 | 18 | #> 19 | 20 | #Connect to ExO 21 | $Cred = Get-Credential 22 | $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $Cred -Authentication Basic -AllowRedirection 23 | Import-PSSession $Session 24 | 25 | #Get all Exp Groups 26 | $ExpGroups = Get-UnifiedGroup -ResultSize unlimited | ? {$_.alias -like "Exp*"} 27 | 28 | #Start Foreach Loop 29 | Foreach ($Group in $ExpGroups) { 30 | 31 | #Document the Group Being Processed, incase of errors 32 | $DN = $Group.DisplayName 33 | Write-Host -ForegroundColor Green “Updating Email Address for $DN” 34 | 35 | #Set Variables 36 | $Alias = $Group.Alias 37 | $Current = ($Group.primarysmtpaddress).toString() 38 | $Domain = $Current.Split("@")[1] 39 | $New = (“$Alias” + “@” + “$Domain”).ToString() 40 | 41 | #Update the PrimarySMTPAddress 42 | Set-UnifiedGroup $Alias -PrimarySMTPAddress $New 43 | } 44 | 45 | #Export the Expired Group with the updated addresses 46 | Write-Host " " 47 | Write-Host -ForegroundColor Red “Generating a report to show all Exp Groups and their new PrimarySMTPAddresses” 48 | $ExpGroups = Get-UnifiedGroup -ResultSize unlimited | ? {$_.alias -like "Exp*"} | select DisplayName, Alias, PrimarySmtpAddress 49 | $ExpGroups | Export-CSV c:\temp\Expired_Groups.csv -notype 50 | -------------------------------------------------------------------------------- /SDS Scripts/Set-Expired_Sections_Hidden.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Set-Expired_Sections_as_Hidden.ps1 4 | 5 | Synopsis: 6 | This script is designed to Set all expired sections as hidden. 7 | 8 | Syntax Examples and Options: 9 | .\Set-Expired_Sections_as_Hidden.ps1 10 | 11 | Written By: 12 | Bill Sluss 13 | 14 | Change Log: 15 | Version 1.0, 8/9/2018 - First Draft 16 | #> 17 | 18 | #Connect to Azure and Exchange Online 19 | $Cred = Get-Credential 20 | 21 | $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $Cred -Authentication Basic -AllowRedirection 22 | Import-PSSession $Session 23 | 24 | #Get All Sections potentially in the GAL 25 | $Sections = get-UnifiedGroup | ? {$_.alias -like "Exp*"} 26 | 27 | #Run Foreach loop against each section 28 | Foreach ($Section in $Sections) { 29 | #Set the variable 30 | $DN = $Section.DisplayName 31 | $Addr = $Section.PrimarySmtpAddress 32 | 33 | #Write Progress 34 | Write-Host -foregroundcolor green "Setting Class Hidden - $DN" 35 | 36 | #Set the group as hidden 37 | Set-UnifiedGroup -Identity $Addr -HiddenFromAddressListsEnabled $true -warningaction:silentlycontinue 38 | } 39 | 40 | Write-Host -foregroundcolor green "Script Complete" -------------------------------------------------------------------------------- /SDS Scripts/Set-SDS_Attributes_For_All_Teachers_Security_Group.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Set-SDS_Attributes_For_All_Teachers_Security_Group.ps1 4 | 5 | .Synopsis 6 | This script is designed to add the AllTeachersSecurityGroup SDS extension attributes to a group not created by SDS. 7 | 8 | .Description 9 | This script will use Graph to check the group then update it with the SDS extension attribute for the 'All Teachers' security group. 10 | 11 | .Example 12 | .\Set-SDS_Attributes_For_All_Teachers_Security_Group.ps1 -groupId 13 | 14 | .Notes 15 | This script is only supposed to be used for a group that contains all teachers. 16 | #> 17 | 18 | Param ( 19 | [Parameter(Mandatory=$true)] 20 | [string] $groupId, 21 | [Parameter(Mandatory=$false)] 22 | [string] $graphVersion = "beta", 23 | [Parameter(Mandatory=$false)] 24 | [switch] $PPE = $false 25 | ) 26 | 27 | $GraphEndpointProd = "https://graph.microsoft.com" 28 | $GraphEndpointPPE = "https://graph.microsoft-ppe.com" 29 | 30 | function Get-PrerequisiteHelp 31 | { 32 | Write-Output @" 33 | ======================== 34 | Required Prerequisites 35 | ======================== 36 | 37 | 1. Install Microsoft Graph Powershell Module with the command 'Install-Module Microsoft.Graph' 38 | 39 | 2. Check that you can connect to your tenant directory from the PowerShell module to make sure everything is set up correctly. 40 | 41 | a. Open a separate PowerShell session 42 | 43 | b. Execute: "Connect-Graph" to bring up a sign-in UI. 44 | 45 | c. Sign in with any tenant administrator credentials. 46 | 47 | d. If you are returned to the PowerShell session without error, you are correctly set up. 48 | 49 | 3. Ensure that you have access to the following permission scopes: Group.ReadWrite.All 50 | 51 | 4. Retry this script. If you still get an error about failing to load the Microsoft Graph module, troubleshoot why "Import-Module Microsoft.Graph.Authentication" isn't working. 52 | 53 | (END) 54 | ======================== 55 | "@ 56 | } 57 | 58 | # Main 59 | 60 | $graphEndPoint = $GraphEndpointProd 61 | 62 | if ($PPE) 63 | { 64 | $graphEndPoint = $GraphEndpointPPE 65 | } 66 | 67 | try 68 | { 69 | Import-Module Microsoft.Graph.Authentication | Out-Null 70 | } 71 | catch 72 | { 73 | Write-Error "Failed to load Microsoft Graph PowerShell Module." 74 | Get-PrerequisiteHelp | Out-String | Write-Error 75 | throw 76 | } 77 | 78 | # Connecting to resources 79 | Connect-Graph -scope "Group.ReadWrite.All" | Out-Null 80 | 81 | #preparing uri string 82 | $grpSelectClause = "?`$select=id,displayName,extension_fe2174665583431c953114ff7268b7b3_Education_ObjectType" 83 | $grpUri = "$graphEndPoint/$graphVersion/groups/$groupId/$grpSelectClause" 84 | 85 | try { 86 | $graphResponse = Invoke-GraphRequest -Method GET -Uri $grpUri -ContentType "application/json" 87 | $grp = $graphResponse 88 | } 89 | catch{ 90 | throw "Could not retrieve group." 91 | } 92 | 93 | if ( !($grp.extension_fe2174665583431c953114ff7268b7b3_Education_ObjectType) ) { # Filtering out group already with SDS attribute 94 | $uri = "$graphEndPoint/$graphVersion/groups/" + $groupId 95 | $requestBody = '{ 96 | "extension_fe2174665583431c953114ff7268b7b3_Education_ObjectType": "AllTeachersSecurityGroup" 97 | }' 98 | 99 | $result = Invoke-GraphRequest -Method Patch -Uri $uri -body $requestBody -ContentType "application/json" -SkipHttpErrorCheck 100 | } 101 | else { 102 | Write-Host "`nCannot update this group because it already has SDS attributes." -ForegroundColor Yellow 103 | $grp 104 | } 105 | 106 | Write-Output "`n`nDone. Please run 'Disconnect-Graph' if you are finished.`n" 107 | -------------------------------------------------------------------------------- /SDS Scripts/Set-Some_Sections_as_Hidden.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | Set-Some_Sections_as_Hidden.ps1 4 | 5 | Synopsis: 6 | This script is designed to import a CSV file that contains sections in the simple format noted below. The CSV should reside in the c:\temp directory, and be called Section.CSV file. Once imported, this script will hide any section from the GAL contained the CSV file. 7 | 8 | CSV Format: Section.csv Example: 9 | 10 | HeaderRow PrimarySmtpAddress 11 | -------------- ------------------ 12 | group1@contoso.com 13 | group2@contoso.com 14 | group3@contoso.com 15 | 16 | 17 | Syntax Examples and Options: 18 | .\Set-Some_Sections_as_Hidden.ps1 19 | 20 | Written By: 21 | Bill Sluss 22 | 23 | Change Log: 24 | Version 1.0, 12/06/2016 - First Draft 25 | #> 26 | 27 | #Connect to Azure and Exchange Online 28 | $Cred = Get-Credential 29 | $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $Cred -Authentication Basic -AllowRedirection 30 | Import-PSSession $Session 31 | Connect-MsolService -credential $cred 32 | 33 | #Get All Sections potentially in the GAL 34 | $Sections = Import-CSV C:\temp\Section.csv 35 | 36 | #Run Foreach loop against each section 37 | Foreach ($Section in $Sections) { 38 | 39 | #Tag the variable for use in the set cmd 40 | $Addr = $Section.PrimarySmtpAddress 41 | 42 | #Get the DisplayName of the group for the progress display 43 | $Group2 = Get-UnifiedGroup -Identity $Addr 44 | $DN = $Section.Displayname 45 | 46 | #Write Progress 47 | Write-Host -foregroundcolor green "Setting hidden attribute on group $DN" 48 | 49 | #Set the group as hidden 50 | Set-UnifiedGroup -Identity $Addr -HiddenFromAddressListsEnabled $true -warningaction:silentlycontinue 51 | } 52 | 53 | Write-Host -foregroundcolor green "Script Complete" 54 | -------------------------------------------------------------------------------- /SDS Scripts/common.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Script Name: 3 | common.ps1 4 | 5 | Synopsis: 6 | Contains functions common to SDS Scripts. Must be downloaded into same folder where the scripts are run. 7 | 8 | Written By: 9 | Ayron Johnson 10 | 11 | Change Log: 12 | Version 1.0, 07/26/2021 - First Draft 13 | #> 14 | 15 | function Initialize($graphscopes) { 16 | import-module Microsoft.Graph.Authentication -MinimumVersion 0.9.1 17 | $null = Write-Output "If prompted, please use a tenant admin-account to grant access to $graphscopes privileges" 18 | $firstToken = Refresh-Token $null $graphscopes 19 | return $firstToken 20 | } 21 | function Refresh-Token($lastRefreshed, $graphscopes) { 22 | $currentDT = get-date 23 | if ($lastRefreshed -eq $null -or (New-TimeSpan -Start $currentDT -End $lastRefreshed).Minutes -gt 10) { 24 | connect-graph -scopes $graphscopes | Out-Null 25 | $lastRefreshed = get-date 26 | } 27 | return $lastRefreshed 28 | } 29 | 30 | # Gets data from all pages 31 | function PageAll-GraphRequest($initialUri, $refreshToken, $method, $graphscopes, $logFilePath) { 32 | 33 | $result = @() 34 | 35 | $currentUrl = $initialUri 36 | 37 | while ($currentUrl -ne $null) { 38 | Refresh-Token $refreshToken $graphscopes 39 | $response = invoke-graphrequest -Method $method -Uri $currentUrl -ContentType "application/json" 40 | $result += $response.value 41 | $currentUrl = $response.'@odata.nextLink' 42 | } 43 | $global:nextLink = $response.'@odata.nextLink' 44 | return $result 45 | } 46 | 47 | function PageAll-GraphRequest-WriteToFile($initialUri, $refreshToken, $method, $graphscopes, $logFilePath, $filePath, $objectProperties, $eduObjectType) { 48 | 49 | Remove-ExistingFile $filePath 50 | 51 | $currentUrl = $initialUri 52 | $recordCount = 0 53 | 54 | while ($currentUrl -ne $null) { 55 | Refresh-Token $refreshToken $graphscopes 56 | $response = invoke-graphrequest -Method $method -Uri $currentUrl -ContentType "application/json" 57 | $response.value | select-object -property $objectProperties | where-object {$_.Id -ne $null} | export-csv -Path "$filePath" -Append -NoTypeInformation -Encoding utf8 58 | 59 | $currentUrl = $response.'@odata.nextLink' 60 | $recordCount += $response.value.Count 61 | } 62 | $global:nextLink = $response.'@odata.nextLink' 63 | Write-Output "[$(get-date -Format G)] Retrieve $($recordCount) $($eduObjectType)s." | out-file $logFilePath -Append -Encoding utf8 64 | } 65 | 66 | function TokenSkipCheck ($uriToCheck, $logFilePath) 67 | { 68 | if ($skipToken -eq "." ) { 69 | $checkedUri = $uriToCheck 70 | } 71 | else { 72 | $checkedUri = $skipToken 73 | } 74 | 75 | return $checkedUri 76 | } 77 | 78 | function Remove-ExistingFile ($filePath) 79 | { 80 | if (Test-Path $filePath) { 81 | Remove-Item $filePath 82 | } 83 | } -------------------------------------------------------------------------------- /SDSDataLakeTroubleshooting/TroubleshootSDSDataLake.pbit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/SDSDataLakeTroubleshooting/TroubleshootSDSDataLake.pbit -------------------------------------------------------------------------------- /SDSProfileManagementDocs/README.md: -------------------------------------------------------------------------------- 1 | # School Data Sync Profile Management Preview : Introduction 2 | This document provides information on setting up automated sync and profile management using the Preview version of School Data Sync APIs. 3 | 4 | [School Data Sync](https://sds.microsoft.com/) helps to automate the process of importing and synchronizing roster data from student information systems around the world with Azure AAD and Office 365. To setup the sync, school IT can chose to login to the SDS portal and create a sync profile and chose a deployment method – either using a CSV file or a supported SIS API connector. In addition to enabling sync from the SDS portal you can also setup one using the APIs described in this document. 5 | 6 | Here are some helpful links to get started: 7 | 8 | Getting Started: 9 | 10 | - [Introduction to Automated Sync and Profile Management APIs](./scenarios/SDSProfileAPIIntroduction.md) 11 | 12 | Profile Management Scenarios: 13 | - [Create Profile using CSV Files](./scenarios/create-synchronization-profile.md) 14 | - [Create Profile using an API Connector](./scenarios/create-api-synchronization-profile.md) 15 | - [Update operations on SDS Sync Profiles](./scenarios/update-synchronization-profile.md) 16 | - [Troubleshooting Sync failures](./scenarios/troubleshooting-sync-failures.md) 17 | 18 | Profile Management APIs: 19 | - [CreateProfile](./api/educationsynchronizationprofile_post.md) 20 | - [DeleteProfile](./api/educationsynchronizationprofile_delete.md) 21 | - [GetErrors](./api/educationsynchronizationerrors_get.md) 22 | - [GetStatus](./api/educationsynchronizationprofilestatus_get.md) 23 | - [GetUploadURL](./api/educationsynchronizationprofile_uploadurl.md) 24 | - [GetProfile](./api/educationsynchronizationprofile_get.md) 25 | - [ListProfile](./api/educationsynchronizationprofile_list.md) 26 | - [PauseProfileSync](./api/educationsynchronizationprofile_pause.md) 27 | - [ResetProfile](./api/educationsynchronizationprofile_reset.md) 28 | - [ResumeProfile](./api/educationsynchronizationprofile_resume.md) 29 | - [UpdateProfile](./api/educationsynchronizationprofile_put.md) 30 | - [Start](./api/educationsynchronizationprofile_start.md) 31 | 32 | ## Contribute 33 | Send a pull request out to contribute. 34 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/api/educationsynchronizationerrors_get.md: -------------------------------------------------------------------------------- 1 | # Get educationSynchronizationErrors 2 | 3 | Get the errors generated during a sync of a specific school data [synchronization profile](../resources/educationsynchronizationprofile.md) in the tenant. 4 | 5 | ## Permissions 6 | One of the following permissions is required to call this API. To learn more, including how to choose permissions, see [Permissions](../../../concepts/permissions_reference.md). 7 | 8 | | Permission type | Permissions (from least to most privileged) | 9 | |:-----------|:------| 10 | | Delegated (work or school account) | EduAdministration.Read, EduAdministration.ReadWrite | 11 | |Delegated (personal Microsoft account|Not supported.| 12 | |Application|Not supported.| 13 | 14 | ## HTTP request 15 | 16 | ```http 17 | GET /synchronizationProfiles/{id}/errors 18 | ``` 19 | ## Optional query parameters 20 | This method supports the following [OData Query Parameters](http://developer.microsoft.com/en-us/graph/docs/overview/query_parameters) to help customize the response: $filter, $orderby, $top, $skip, and $count. 21 | 22 | ## Request headers 23 | | Name | Type | Description| 24 | |:-----------|:------|:----------| 25 | | Authorization | string | Bearer {token}. Required. | 26 | 27 | ## Request body 28 | Do not supply a request body for this method. 29 | ## Response 30 | If successful, this method returns a `200 OK` response code and a collection of [synchronization error](../resources/educationsynchronizationerror.md) objects in the response body. 31 | 32 | ## Example 33 | ##### Request 34 | The following is an example of the request. 35 | 39 | ```http 40 | GET https://graph.microsoft.com/beta/education/synchronizationProfiles/{id}/error 41 | ``` 42 | 43 | ##### Response 44 | The following is an example of the response. 45 | 46 | >**Note:** The response object shown here might be shortened for readability. All the properties will be returned from an actual call. 47 | 48 | 53 | ```http 54 | { 55 | "@odata.context": "https://graph.microsoft.com/beta/$metadata#education/synchronizationProfiles('{id}')/errors", 56 | "@odata.count": 14, 57 | "value": [ 58 | { 59 | "entryType": "Student", 60 | "errorCode": "UnsynchronizableChange", 61 | "errorMessage": "Student cannot be updated as no matching entry in Active Directory was found for Student. Verify the identity matching criteria for the profile.", 62 | "joiningValue": "richard.2wilson@testschool.edu", 63 | "recordedDateTime": "2017-07-05T00:52:45Z", 64 | "reportableIdentifier": "richard.2wilson" 65 | }, 66 | { 67 | "entryType": "Teacher", 68 | "errorCode": "UnsynchronizableChange", 69 | "errorMessage": "Teacher cannot be updated as no matching entry in Active Directory was found for Teacher. Verify the identity matching criteria for the profile.", 70 | "joiningValue": "alberto2.dorsey@testschool.edu", 71 | "recordedDateTime": "2017-07-05T00:52:57Z", 72 | "reportableIdentifier": "alberto2.dorsey" 73 | }, 74 | { 75 | "entryType": "Teacher", 76 | "errorCode": "UnsynchronizableChange", 77 | "errorMessage": "Teacher cannot be updated as no matching entry in Active Directory was found for Teacher. Verify the identity matching criteria for the profile.", 78 | "joiningValue": "madeline2.bullock@testschool.edu", 79 | "recordedDateTime": "2017-07-05T00:52:57Z", 80 | "reportableIdentifier": "madeline2.bullock" 81 | } 82 | ] 83 | } 84 | ``` -------------------------------------------------------------------------------- /SDSProfileManagementDocs/api/educationsynchronizationprofile_delete.md: -------------------------------------------------------------------------------- 1 | # Delete a educationSynchronizationProfile 2 | 3 | Delete a school data [synchronization profile](../resources/educationsynchronizationprofile.md) in the tenant based on the identifier. 4 | 5 | ## Permissions 6 | One of the following permissions is required to call this API. To learn more, including how to choose permissions, see [Permissions](../../../concepts/permissions_reference.md). 7 | 8 | | Permission type | Permissions | 9 | |:-----------|:----------| 10 | | Delegated (work or school account) | EduAdministration.ReadWrite | 11 | 12 | ## HTTP request 13 | 14 | ```http 15 | DELETE /synchronizationProfiles/{id} 16 | ``` 17 | 18 | ## Request headers 19 | | Name | Type | Description| 20 | |:-----------|:------|:----------| 21 | | Authorization | string | Bearer {token}. Required. | 22 | |Delegated (personal Microsoft account|Not supported.| 23 | |Application|Not supported.| 24 | 25 | ## Request body 26 | Do not supply a request body for this method. 27 | ## Response 28 | If successful, this method returns a `202 Accepted` response code and no response body. 29 | 30 | ## Example 31 | ##### Request 32 | Here is an example of the request. 33 | 37 | ```http 38 | DELETE https://graph.microsoft.com/beta/education/synchronizationProfiles/{id} 39 | ``` 40 | 41 | ##### Response 42 | Here is an example of the response. 43 | 47 | ```http 48 | HTTP/1.1 202 Accepted 49 | ``` 50 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/api/educationsynchronizationprofile_pause.md: -------------------------------------------------------------------------------- 1 | # Pause sync on an educationSynchronizationProfile 2 | 3 | Pause the sync of a specific school data [synchronization profile](../resources/educationsynchronizationprofile.md) in the tenant. 4 | 5 | ## Permissions 6 | One of the following permissions is required to call this API. To learn more, including how to choose permissions, see [Permissions](../../../concepts/permissions_reference.md). 7 | 8 | | Permission type | Permissions | 9 | |:-----------|:----------| 10 | | Delegated (work or school account) | EduAdministration.ReadWrite | 11 | |Delegated (personal Microsoft account|Not supported.| 12 | |Application|Not supported.| 13 | 14 | ## HTTP request 15 | 16 | ```http 17 | POST /synchronizationProfiles/{id}/pause 18 | ``` 19 | 20 | ## Request headers 21 | | Name | Type | Description| 22 | |:-----------|:------|:----------| 23 | | Authorization | string | Bearer {token}. Required. | 24 | 25 | ## Request body 26 | Do not supply a request body for this method. 27 | ## Response 28 | If successful, this method returns a `200 OK` response code. 29 | 30 | ## Example 31 | ##### Request 32 | The following is an example of the request. 33 | 37 | ```http 38 | POST https://graph.microsoft.com/beta/education/synchronizationProfiles/{id}/pause 39 | ``` 40 | 41 | ##### Response 42 | 43 | There is no response body. -------------------------------------------------------------------------------- /SDSProfileManagementDocs/api/educationsynchronizationprofile_reset.md: -------------------------------------------------------------------------------- 1 | # Reset sync on an educationSynchronizationProfile 2 | 3 | Reset the sync of a specific school data [synchronization profile](../resources/educationsynchronizationprofile.md) in the tenant. 4 | 5 | > **Note:** This operation will cause synchronization to restart. Any errors encountered will be deleted. No data will be deleted from Azure Active Directory (Azure AD). 6 | 7 | ## Permissions 8 | One of the following permissions is required to call this API. To learn more, including how to choose permissions, see [Permissions](../../../concepts/permissions_reference.md). 9 | 10 | | Permission type | Permissions | 11 | |:-----------|:----------| 12 | | Delegated (work or school account) | EduAdministration.ReadWrite | 13 | |Delegated (personal Microsoft account|Not supported.| 14 | |Application|Not supported.| 15 | 16 | ## HTTP request 17 | 18 | ```http 19 | POST /synchronizationProfiles/{id}/reset 20 | ``` 21 | 22 | ## Request headers 23 | | Name | Type | Description| 24 | |:-----------|:------|:----------| 25 | | Authorization | string | Bearer {token}. Required. | 26 | 27 | ## Request body 28 | Do not supply a request body for this method. 29 | ## Response 30 | If successful, this method returns a `200 OK` response code. 31 | 32 | ## Example 33 | ##### Request 34 | The following is an example of the request. 35 | 39 | ```http 40 | POST https://graph.microsoft.com/beta/education/synchronizationProfiles/{id}/reset 41 | ``` 42 | 43 | ##### Response 44 | 45 | There is no response body. -------------------------------------------------------------------------------- /SDSProfileManagementDocs/api/educationsynchronizationprofile_resume.md: -------------------------------------------------------------------------------- 1 | # Resume sync on an educationSynchronizationProfile 2 | 3 | Resume the sync of a specific school data [synchronization profile](../resources/educationsynchronizationprofile.md) in the tenant. 4 | 5 | ## Permissions 6 | One of the following permissions is required to call this API. To learn more, including how to choose permissions, see [Permissions](../../../concepts/permissions_reference.md). 7 | 8 | | Permission type | Permissions | 9 | |:-----------|:----------| 10 | | Delegated (work or school account) | EduAdministration.ReadWrite | 11 | |Delegated (personal Microsoft account|Not supported.| 12 | |Application|Not supported.| 13 | 14 | ## HTTP request 15 | 16 | ```http 17 | POST /synchronizationProfiles/{id}/resume 18 | ``` 19 | 20 | ## Request headers 21 | | Name | Type | Description| 22 | |:-----------|:------|:----------| 23 | | Authorization | string | Bearer {token}. Required. | 24 | 25 | ## Request body 26 | Do not supply a request body for this method. 27 | ## Response 28 | If successful, this method returns a `200 OK` response code. 29 | 30 | ## Example 31 | ##### Request 32 | The following is an example of the request. 33 | 37 | ```http 38 | POST https://graph.microsoft.com/beta/education/synchronizationProfiles/{id}/resume 39 | ``` 40 | 41 | ##### Response 42 | 43 | There is no response body. -------------------------------------------------------------------------------- /SDSProfileManagementDocs/api/educationsynchronizationprofile_uploadurl.md: -------------------------------------------------------------------------------- 1 | # educationSynchronizationProfile: uploadUrl 2 | 3 | Retrieve a shared access signature (SAS) for uploading source files to Azure blob storage for a specific school data [synchronization profile](../resources/educationsynchronizationprofile.md) in the tenant. The SAS token has a validity of one hour. 4 | 5 | > **Note:** To access the blob storage with the SAS token, use the [Azure storage SDKs](https://github.com/search?q=org%3AAzure+azure-storage) or [AzCopy](https://docs.microsoft.com/en-us/azure/storage/storage-use-azcopy). 6 | 7 | ## Permissions 8 | One of the following permissions is required to call this API. To learn more, including how to choose permissions, see [Permissions](../../../concepts/permissions_reference.md). 9 | 10 | | Permission type | Permissions | 11 | |:-----------|:----------| 12 | | Delegated (work or school account) | EduAdministration.ReadWrite | 13 | |Delegated (personal Microsoft account|Not supported.| 14 | |Application|Not supported.| 15 | 16 | ## HTTP request 17 | 18 | ```http 19 | GET /synchronizationProfiles/{id}/uploadUrl 20 | ``` 21 | 22 | ## Request headers 23 | | Name | Type | Description| 24 | |:-----------|:------|:----------| 25 | | Authorization | string | Bearer {token}. Required. | 26 | 27 | ## Request body 28 | Do not supply a request body for this method. 29 | ## Response 30 | If successful, this method returns a `200 OK` response code and a SAS URL for the [educationSynchronizationProfile](../resources/educationsynchronizationprofile.md) in the response body. 31 | 32 | ## Example 33 | ##### Request 34 | The following is an example of the request. 35 | 39 | ```http 40 | GET https://graph.microsoft.com/beta/education/synchronizationProfiles/{id}/uploadUrl 41 | ``` 42 | 43 | ##### Response 44 | The following is an example of the response. 45 | 46 | >**Note:** The response object shown here might be shortened for readability. All the properties will be returned from an actual call. 47 | 48 | 52 | ```http 53 | { 54 | "@odata.context": "https://graph.microsoft.com/beta/$metadata#String", 55 | "value": "https://sdsstorage.blob.core.windows.net/86904b1e-c7d0-4ead-b13a-98f11fc400ee?sv=2015-07-08&sr=c&si=SharedAccessPolicy_20170704044441&sig=CH65vxxqXETCkQNH0Lfsu31cUo0s0XcEEo0OE2YiL6Q%3D&se=2017-07-04T08%3A43%3A01Z&sp=w" 56 | } 57 | ``` -------------------------------------------------------------------------------- /SDSProfileManagementDocs/api/educationsynchronizationprofilestatus_get.md: -------------------------------------------------------------------------------- 1 | # Get the status of an educationSynchronizationProfile 2 | 3 | Get the status of a specific school data [synchronization profile](../resources/educationsynchronizationprofile.md) in the tenant. The response will indicate the status of the sync. 4 | 5 | ## Permissions 6 | One of the following permissions is required to call this API. To learn more, including how to choose permissions, see [Permissions](../../../concepts/permissions_reference.md). 7 | 8 | | Permission type | Permissions (from least to most privileged) | 9 | |:-----------|:----------| 10 | | Delegated (work or school account) | EduAdministration.Read, EduAdministration.ReadWrite | 11 | |Delegated (personal Microsoft account|Not supported.| 12 | |Application|Not supported.| 13 | 14 | ## HTTP request 15 | 16 | ```http 17 | GET /synchronizationProfiles/{id}/profileStatus 18 | ``` 19 | 20 | ## Request headers 21 | | Name | Type | Description| 22 | |:-----------|:------|:----------| 23 | | Authorization | string | Bearer {token}. Required. | 24 | 25 | ## Request body 26 | Do not supply a request body for this method. 27 | ## Response 28 | If successful, this method returns a `200 OK` response code and an [educationsynchronizationprofilestatus](../resources/educationsynchronizationprofilestatus.md) object in the response body. 29 | 30 | ## Example 31 | ##### Request 32 | The following is an example of the request. 33 | 37 | ```http 38 | GET https://graph.microsoft.com/beta/education/synchronizationProfiles/{id}/profileStatus 39 | ``` 40 | 41 | ##### Response 42 | The following is an example of the response. 43 | 44 | >**Note:** The response object shown here might be shortened for readability. All the properties will be returned from an actual call. 45 | 46 | 50 | ```http 51 | { 52 | "@odata.context": "https://graph.microsoft.com/beta/$metadata#education/synchronizationProfiles('{id}')/profileStatus/$entity", 53 | "status": "inProgress", 54 | "lastSynchronizationDateTime": "2017-07-04T22:06:37.6472621Z" 55 | } 56 | ``` -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationSynchronizationConnectionSettings.md: -------------------------------------------------------------------------------- 1 | # educationSynchronizationConnectionSettings resource type 2 | 3 | Represents the provider connection settings. This allows the system to know how to connect to the provider APIs. 4 | 5 | > **Note:** This complex type is abstract. Refer to the specific types of connection settings listed. 6 | 7 | ## Derived types 8 | | Type | Description | 9 | |:-|:-| 10 | | [**educationSynchronizationOAuth1ConnectionSettings**](educationSynchronizationOAuth1ConnectionSettings.md) | Use this type to provide OAuth1 connection settings | 11 | | [**educationSynchronizationOAuth2ClientCredentialsConnectionSettings**](educationSynchronizationOAuth2ClientCredentialsConnectionSettings.md) | Use this type to provide OAuth2 Client Credentials Grant connection settings | 12 | 13 | ## Properties 14 | 15 | | Property | Type | Description | 16 | |:-|:-|:-| 17 | | **clientId** | String | Client id used to connect to the provider | 18 | | **clientSecret** | String | Client secret to authenticate connection to the provider | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationSynchronizationOAuth1ConnectionSettings.md: -------------------------------------------------------------------------------- 1 | # educationSynchronizationOAuth1ConnectionSettings resource 2 | 3 | When OAuth1 is to be used to connect to the data provider, this connection settings type should be used to setup the profile. 4 | 5 | Derived from [educationSynchronizationConnectionSettings](educationSynchronizationConnectionSettings.md) 6 | 7 | ## Properties 8 | 9 | No additional properties are exposed by this type 10 | 11 | ## JSON 12 | 13 | ```json 14 | "connectionSettings": { 15 | "@odata.type": "#microsoft.graph.educationSynchronizationOAuth1ConnectionSettings", 16 | "clientId": "String", 17 | "clientSecret": "String" 18 | } 19 | ``` 20 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationSynchronizationOAuth2ClientCredentialsConnectionSettings.md: -------------------------------------------------------------------------------- 1 | # educationSynchronizationOAuth2ClientCredentialsConnectionSettings resource 2 | 3 | When [OAuth2 Client Credentials Grant](https://tools.ietf.org/html/rfc6749#section-4.4) is to be used to connect to the data provider, this connection settings type should be used to setup the profile. 4 | 5 | Derived from [educationSynchronizationConnectionSettings](educationSynchronizationConnectionSettings.md) 6 | 7 | ## Properties 8 | 9 | | Property | Type | Description | 10 | |:-|:-|:-| 11 | | **tokenUrl** | String | The URL to get access tokens for the data provider | 12 | | **scope** | String | [The scope of the access request](https://tools.ietf.org/html/rfc6749#section-3.3) | 13 | 14 | ## JSON 15 | 16 | ```json 17 | "connectionSettings": { 18 | "@odata.type": "#microsoft.graph.educationSynchronizationOAuth2ClientCredentialsConnectionSettings", 19 | "clientId": "String", 20 | "clientSecret": "String", 21 | "tokenUrl": "String", 22 | "scope": "String" 23 | } 24 | ``` 25 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationcsvdataprovider.md: -------------------------------------------------------------------------------- 1 | # educationCsvDataProvider resource type 2 | 3 | Used to set up the school data synchronization profile when CSV files are the input source. 4 | 5 | Derived from [educationSynchronizationDataProvider](educationsynchronizationdataprovider.md). 6 | 7 | ## Properties 8 | 9 | | Property | Type | Description | 10 | |:-|:-|:-| 11 | | **customizations** | [educationSynchronizationCustomizations](educationsynchronizationcustomizations.md) | Optional customizations to be applied to the synchronization profile.| 12 | 13 | ## JSON representation 14 | 15 | 22 | 23 | 24 | ```json 25 | "dataProvider":{ 26 | "@odata.type": "#microsoft.graph.educationCsvDataProvider", 27 | "customizations": { "@odata.type": "microsoft.graph.educationSynchronizationCustomizations" } 28 | } 29 | } 30 | ``` 31 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationfilesynchronizationverificationmessage.md: -------------------------------------------------------------------------------- 1 | # educationFileSynchronizationVerificationMessage resource type 2 | 3 | Represents an error returned to the client in response to a request to [start synchronization](../api/educationsynchronizationprofile_start.md) for CSV-based school data profiles. The resource will contain errors that result from the verification. Users must fix the source data before you restart the request to synchronize with Azure Active Directory (Azure AD). 4 | 5 | ## Properties 6 | 7 | | Property | Type | Description | 8 | |:-|:-|:-| 9 | | **type** | string | Type of the message. Possible values are: `error`, `warning`, `information`. | 10 | | **filename** | string | Source file that contains the error. | 11 | | **description** | string | Detailed information about the message type. | 12 | 13 | ## JSON representation 14 | 15 | 22 | 23 | ```json 24 | { 25 | "type": "String", 26 | "fileName": "String", 27 | "description": "String" 28 | } 29 | ``` -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationidentitycreationconfiguration.md: -------------------------------------------------------------------------------- 1 | ## educationIdentityCreationConfiguration resource type 2 | 3 | Defines the settings on creation of school data profile identities. These identities include students and teachers. Based on these settings, the users will be created in the directory. 4 | 5 | > **Note:** If you have directory sync turned on to sync between on-premises Active Directory and Azure Active Directory (Azure AD), use the [educationIdentityMatchingConfiguration](educationidentitymatchingconfiguration.md) resource instead. 6 | 7 | Derived from [identitySyncConfiguration](identitySyncConfiguration.md). 8 | 9 | ## Properties 10 | 11 | | Property | Type | Description | 12 | |:-|:-|:-| 13 | | **userDomains** | [educationIdentityDomain](educationidentitydomain.md) collection | Sets the list of domains to use per user type. | 14 | 15 | 16 | ## JSON representation 17 | 24 | 25 | ```json 26 | "identitySynchronizationConfiguration": { 27 | "@odata.type": "#microsoft.graph.educationIdentityCreationConfiguration", 28 | "userDomains": [ 29 | { 30 | "@odata.type": "#microsoft.graph.educationIdentityDomain", 31 | } 32 | ] 33 | } 34 | ``` -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationidentitydomain.md: -------------------------------------------------------------------------------- 1 | # educationIdentityDomain resource type 2 | 3 | Represents the mapping between an education user type and the domain the user's account belongs to. The domain resource is part of the [identity creation configuration](educationidentitycreationconfiguration.md). 4 | 5 | ## Properties 6 | 7 | | Property | Type | Description | 8 | |:-|:-|:-| 9 | | **appliesTo** | string | The user role type to assign to license. Possible values are: `student`, `teacher`. | 10 | | **name** | string | Represents the domain for the user account. | 11 | 12 | ## JSON representation 13 | 20 | 21 | ```json 22 | { 23 | "appliesTo": {"@odata.type": "#microsoft.graph.educationUserRole"}, 24 | "name": "String" 25 | } 26 | ``` 27 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationidentitymatchingconfiguration.md: -------------------------------------------------------------------------------- 1 | ## educationIdentityMatchingConfiguration resource type 2 | 3 | Defines the settings for matching school data profile identities. These identities include students and teachers. Based on these settings, the users will be updated in the directory. 4 | 5 | > **Note:** No users are created when this resource is selected. 6 | 7 | ## Properties 8 | 9 | | Property | Type | Description | 10 | |:-|:-|:-| 11 | | **matchingOptions** | [educationIdentityMatchingOptions](educationidentitymatchingoptions.md) collection | Mapping between the user account and the options to use to uniquely identify the user to update. | 12 | 13 | ## JSON representation 14 | 21 | 22 | ```json 23 | "identitySynchronizationConfiguration": { 24 | "@odata.type": "#microsoft.graph.educationIdentityMatchingConfiguration", 25 | "matchingOptions": [ 26 | { 27 | "appliesTo": {"@odata.type": "#microsoft.graph.educationUserRole"}, 28 | "sourcePropertyName": "String", 29 | "targetPropertyName": "String", 30 | "targetDomain": "String" 31 | } 32 | ] 33 | } 34 | ``` 35 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationidentitymatchingoptions.md: -------------------------------------------------------------------------------- 1 | # educationIdentityMatchingOptions resource type 2 | 3 | Provides a mapping between a source property and a target property for matching user accounts. The source property should exist in the source data. The target property should be a valid property in Azure Active Directory (Azure AD). 4 | 5 | ## Properties 6 | 7 | | Property | Type | Description | 8 | |:-|:-|:-| 9 | | **appliesTo** | string | The user role type to assign to the license. Possible values are: `student`, `teacher`. | 10 | | **sourcePropertyName** | string | The name of the source property, which should be a field name in the source data. This property is case-sensitive. | 11 | | **targetPropertyName** | string | The name of the target property, which should be a valid property in Azure AD. This property is case-sensitive. | 12 | | **targetDomain** | string | The domain to suffix with the source property to match on the target. If provided as null, the source property will be used to match with the target property. | 13 | 14 | ## JSON representation 15 | 22 | 23 | ```json 24 | { 25 | "appliesTo": {"@odata.type": "#microsoft.graph.educationUserRole"}, 26 | "sourcePropertyName": "String", 27 | "targetPropertyName": "String", 28 | "targetDomain": "String" 29 | } 30 | ``` 31 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationidentitysynchronizationconfiguration.md: -------------------------------------------------------------------------------- 1 | # educationIdentitySynchronizationConfiguration resource type 2 | 3 | Abstract base class for all school data profile identity synchronization configurations. The derived classes define the behavior for synchronizing identities. The following are the derived types. 4 | 5 | ## Derived types 6 | | Type | Description | 7 | |:-|:-| 8 | | [**educationIdentityMatchingConfiguration**](educationidentitymatchingconfiguration.md) | Use this type to match existing user accounts in Azure Active Directory (Azure AD). | 9 | | [**educationIdentityCreationConfiguration**](educationidentitycreationconfiguration.md) | Use this type to create new user accounts in Azure AD. | 10 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationonerosterapidataprovider.md: -------------------------------------------------------------------------------- 1 | # educationOneRosterApiDataProvider resource 2 | 3 | Used to set up the school data synchronization profile when the [OneRoster API](https://www.imsglobal.org/activity/onerosterlis) is used as the input source. 4 | 5 | Derived from [educationSynchronizationDataProvider](educationsynchronizationdataprovider.md). 6 | 7 | ## Properties 8 | 9 | | Property | Type | Description | 10 | |:-|:-|:-| 11 | | **connectionUrl** | String | The connection URL to the OneRoster instance. | 12 | | **schoolsIds** | String collection | The list of school sourcedIds to sync. | 13 | | **providerName** | String | The OneRoster Service Provider name as defined by the [OneRoster specification](https://www.imsglobal.org/oneroster-v11-final-best-practice-and-implementation-guide#AppA). | 14 | | **connectionSettings** | [educationSynchronizationConnectionSettings](educationSynchronizationConnectionSettings.md) | Connection settings for the OneRoster instance. Should be of type [educationSynchronizationOAuth1ConnectionSettings](educationSynchronizationOAuth1ConnectionSettings.md) or [educationSynchronizationOAuth2ClientCredentialsConnectionSettings](educationSynchronizationOAuth2ClientCredentialsConnectionSettings.md) | 15 | | **customizations** | [educationSynchronizationCustomizations](educationsynchronizationcustomizations.md) | Optional customization to be applied to the synchronization profile.| 16 | 17 | ## JSON representation 18 | 25 | 26 | ```json 27 | "dataProvider": { 28 | "@odata.type": "#microsoft.graph.educationoneRosterApiDataProvider", 29 | "connectionUrl": "String", 30 | "providerName": "String" 31 | "schoolsIds": [ 32 | "String" 33 | ] 34 | "connectionSettings": { 35 | "@odata.type": "#microsoft.graph.educationSynchronizationOAuth1ConnectionSettings", 36 | "clientId": "String", 37 | "clientSecret": "String", 38 | "clientSecret": "String" 39 | }, 40 | "customizations": { "@odata.type": "microsoft.graph.educationSynchronizationCustomizations" } 41 | } 42 | ``` 43 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationpowerschooldataprovider.md: -------------------------------------------------------------------------------- 1 | # educationPowerSchoolDataProvider resource 2 | 3 | Used to set up the school data synchronization profile when [PowerSchool](https://www.powerschool.com/solutions/student-information-system-sis/) is used as the input source. 4 | 5 | Derived from [educationSynchronizationDataProvider](educationsynchronizationdataprovider.md). 6 | 7 | ## Properties 8 | 9 | | Property | Type | Description | 10 | |:-|:-|:-| 11 | | **connectionUrl** | String | The connection URL to the PowerSchool instance. | 12 | | **clientId** | String | The client ID used to connect to PowerSchool. | 13 | | **clientSecret** | String | The client secret to authenticate the connection to the PowerSchool instance. | 14 | | **schoolsIds** | String collection | The list of schools to sync. | 15 | | **schoolYear** | String | The school year to sync. | 16 | | **allowTeachersInMultipleSchools** | Boolean | Indicates whether the source has multiple identifiers for a single student or teacher. | 17 | | **customizations** | [educationSynchronizationCustomizations](educationsynchronizationcustomizations.md) | Optional customization to be applied to the synchronization profile.| 18 | 19 | ## JSON representation 20 | 27 | 28 | ```json 29 | "dataProvider": { 30 | "@odata.type": "#microsoft.graph.educationPowerSchoolDataProvider", 31 | "connectionUrl": "String", 32 | "clientId": "String", 33 | "clientSecret": "String", 34 | "schoolsids": ["String"], 35 | "schoolYear": "String", 36 | "allowTeachersInMultipleSchools": "Boolean", 37 | "customizations": { "@odata.type": "microsoft.graph.educationSynchronizationCustomizations" } 38 | } 39 | ``` 40 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationsynchronizationcustomization.md: -------------------------------------------------------------------------------- 1 | # educationSynchronizationCustomization resource type 2 | 3 | Provides settings for customizing the school data profile synchronization of the resource entities. The customization can be applied to all the entities being synchronized. 4 | 5 | >**Note:** The **synchronizationStartDate** property only applies to the **StudentEnrollment** entity. 6 | 7 | ## Properties 8 | 9 | | Property | Type | Description | 10 | |:-|:-|:-| 11 | | **optionalPropertiesToSync** | collection of string | The collection of property names to sync. If set to null, all properties will be synchronized. | 12 | | **synchronizationStartDate** | DateTime | The date that the synchronization should start. This value should be set to a future date. If set to null, the resource will be synchronized when the profile setup completes. **Note:** This only applies to the **StudentEnrollment** property. | 13 | |**isSyncDeferred** |Boolean | Indicates whether synchronization of the parent entity is deferred to a later date. | 14 | | **allowDisplayNameUpdate** | Boolean | Indicates whether the display name of the resource can be overwritten by the sync. | 15 | 16 | 17 | ## JSON representation 18 | 25 | 26 | ```json 27 | {   28 | "optionalPropertiesToSync":["String"], 29 | "synchronizationStartDate": "DateTimeOffset", 30 | "isSyncDeferred": "Boolean", 31 | "allowDisplayNameUpdate": "Boolean" 32 | } 33 | ``` 34 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationsynchronizationcustomizations.md: -------------------------------------------------------------------------------- 1 | # educationSynchronizationCustomizations resource type 2 | 3 | Contains the list of entities to sync and their [customizations](educationsynchronizationcustomization.md), if any. 4 | 5 | > **Note:** Customization of properties to sync does not apply to the **studentEnrollment** and **teacherRoster** entities. 6 | 7 | This resource is member of the following data providers: 8 | 9 | * [educationCsvDataProvider](educationcsvdataprovider.md) 10 | * [educationPowerSchoolDataProvider](educationpowerschooldataprovider.md) 11 | 12 | ## Properties 13 | 14 | | Property | Type | Description | 15 | |:-|:-|:-| 16 | | **school** | [educationSynchronizationCustomization](educationsynchronizationcustomization.md) | Customization for a school entity. | 17 | | **section** | [educationSynchronizationCustomization](educationsynchronizationcustomization.md) | Customization for a section entity. | 18 | | **student** | [educationSynchronizationCustomization](educationsynchronizationcustomization.md) | Customization for a student entity. | 19 | | **teacher** | [educationSynchronizationCustomization](educationsynchronizationcustomization.md) | Customization for a teacher entity. | 20 | | **studentEnrollment** | [educationSynchronizationCustomization](educationsynchronizationcustomization.md) | Customization for student enrollment. | 21 | | **teacherRoster** | [educationSynchronizationCustomization](educationsynchronizationcustomization.md) | Customization for a teacher roster. | 22 | 23 | ## JSON representation 24 | 31 | 32 | ```json 33 | "customizations": { 34 | "school": {"@odata.type": "microsoft.graph.educationSynchronizationCustomization"}, 35 | "section": {"@odata.type": "microsoft.graph.educationSynchronizationCustomization"}, 36 | "student": {"@odata.type": "microsoft.graph.educationSynchronizationCustomization"}, 37 | "teacher": {"@odata.type": "microsoft.graph.educationSynchronizationCustomization"}, 38 | "studentEnrollment": {"@odata.type": "microsoft.graph.educationSynchronizationCustomization"}, 39 | "teacherRoster": {"@odata.type": "microsoft.graph.educationSynchronizationCustomization"} 40 | } 41 | } 42 | ``` 43 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationsynchronizationdataprovider.md: -------------------------------------------------------------------------------- 1 | # educationSynchronizationDataProvider resource type 2 | 3 | Represents the source SIS schema. This allows the system to know how to map the incoming data to the Azure Active Directory (Azure AD) schema. 4 | 5 | > **Note:** This complex type is abstract. Refer to the specific types of data providers listed. 6 | 7 | ## Derived types 8 | | Type | Description | 9 | |:-|:-|:-| 10 | | [educationcsvdataprovider](educationCsvDataProvider.md) | Used with CSV files as the input source. | 11 | | [educationpowerschooldataprovider](educationPowerSchoolDataProvider.md) | Used with PowerSchool as the input source. | 12 | | [educationonerosterapidataprovider](educationOneRosterApiDataProvider.md) | Used with OneRoster API as the input source. | 13 | 14 | ## Properties 15 | 16 | No properties are exposed by this type. 17 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationsynchronizationerror.md: -------------------------------------------------------------------------------- 1 | # educationSynchronizationError resource type 2 | 3 | Represents an error during school data profile sync. An unique error will be generated for every entry that fails to synchronize with Azure Active Directory (Azure AD). 4 | 5 | ## Methods 6 | 7 | | Method | Return Type | Description | 8 | |:-|:-|:-| 9 | | [Get synchronization errors](../api/educationsynchronizationerrors_get.md) | **educationSynchronizationError** collection| Returns the list of synchronization errors associated with a profile. | 10 | 11 | ## Properties 12 | 13 | | Property | Type | Description | 14 | |:-|:-|:-| 15 | | **entryType** | string | represents the sync entity (school, section, student, teacher) | 16 | | **errorCode** | string | represents the error code for this error | 17 | | **errorMessage** | string | contains a description of the error | 18 | | **joiningValue** | string | the unique identifier for the entry | 19 | | **recordedDateTime** | DateTimeOffset | the time of occurrence of this error | 20 | 21 | ## JSON representation 22 | 29 | 30 | ```json 31 | { 32 | "entryType": "String", 33 | "errorCode": "String", 34 | "errorMessage": "String", 35 | "joiningValue": "String", 36 | "recordedDateTime": "DateTimeOffset", 37 | "reportableIdentifier": "String" 38 | } 39 | ``` 40 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationsynchronizationlicenseassignment.md: -------------------------------------------------------------------------------- 1 | # educationSynchronizationLicenseAssignment resource type 2 | 3 | Represents the license information to assign to user accounts. The resource will be used to set up license assignments when creating new user accounts. 4 | 5 | ## Properties 6 | 7 | | Property | Type | Description | 8 | |:-|:-|:-| 9 | | **appliesTo** | string | The user role type to assign to license. Possible values are: `student`, `teacher`. | 10 | | **skuIds** | collection of strings | Represents the SKU identifiers of the licenses to assign. | 11 | 12 | ## JSON representation 13 | 20 | 21 | ```json 22 | { 23 | "appliesTo": {"@odata.type": "#microsoft.graph.educationUserRole"}, 24 | "skuIds": ["String"] 25 | } 26 | ``` 27 | -------------------------------------------------------------------------------- /SDSProfileManagementDocs/resources/educationsynchronizationprofilestatus.md: -------------------------------------------------------------------------------- 1 | # educationSynchronizationProfileStatus resource type 2 | 3 | Represents the synchronization status of a school data [synchronization profile](educationsynchronizationprofile.md). 4 | 5 | > **Note:** Updates to the **educationSynchronizationProfileStatus** might be delayed due to the asynchronous nature of background sync processing. 6 | 7 | ## Methods 8 | 9 | | Method | Return Type | Description | 10 | |:-|:-|:-| 11 | | [Get status of a sync](../api/educationsynchronizationprofilestatus_get.md) | **educationSynchronizationProfileStatus** | Return the status of a specific synchronization profile. | 12 | 13 | ## Properties 14 | 15 | | Property | Type | Description | 16 | |:-|:-|:-| 17 | | **status** | string | The status of a sync. Possible values are: `paused`, `inProgress`, `success`, `error`, `quarantined`, `validationError`. | 18 | | **lastSynchronizationDateTime** | DateTimeOffset | Represents the time when most recent changes have been observed in the directory. | 19 | 20 | ## JSON representation 21 | 28 | 29 | ```json 30 | { 31 | "@odata.context": "https://graph.microsoft.com/beta/$metadata#education/synchronizationProfiles('{id}')/profileStatus/$entity", 32 | "status": {"@odata.type":"microsoft.graph.educationSynchronizationStatus"}, 33 | "lastSynchronizationDateTime": "DateTimeOffset" 34 | } 35 | ``` -------------------------------------------------------------------------------- /SDSProfileManagementDocs/scenarios/Images/AddGraphAPI.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/SDSProfileManagementDocs/scenarios/Images/AddGraphAPI.PNG -------------------------------------------------------------------------------- /SDSProfileManagementDocs/scenarios/Images/AddPermissions.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/SDSProfileManagementDocs/scenarios/Images/AddPermissions.PNG -------------------------------------------------------------------------------- /SDSProfileManagementDocs/scenarios/Images/Settings.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/O365-EDU-Tools/1121bf849b6308c8727b657c78fd331ec4157b6e/SDSProfileManagementDocs/scenarios/Images/Settings.PNG -------------------------------------------------------------------------------- /SDSProfileManagementDocs/scenarios/synchronization-profile-api-introduction.md: -------------------------------------------------------------------------------- 1 | # School Data Sync Profile APIs Preview 2 | 3 | **This document provides information on setting up automated sync and profile management using the Preview version of [School Data Sync Profile Management APIs](../api/synchronizationprofile_post.md)** 4 | 5 | Background: [School Data Sync](https://sds.microsoft.com/) helps to automate the process of importing and synchronizing roster and account data from student information systems around the world with Azure AAD and Office 365. A synchronization profile is a representation of a configuration that is used for syncing the data. To setup the sync, school IT can chose to login to the SDS portal and create a sync profile and chose a deployment method – either using CSV files or one of the supported SIS connectors or a OneRoster compliant. In addition to enabling sync from the portal you can also use School Data Sync APIs to manage the sync process. This document describes how SDS Management APIs can be used to fully automate SDS profile and sync management without using the SDS Management portal. 6 | 7 | Explore School Data Sync profile management APIs: 8 | - [Create an SDS Profile for SDS Sync using CSV files](create-synchronization-profile.md) 9 | - [Create an SDS Profile for SDS Sync using OneRoster or a supported SIS API Provider](create-api-synchronization-profile.md) 10 | - [Updating an existing sync profile](update-synchronization-profile.md) 11 | - [Troubleshooting sync failures](troubleshooting-sync-failures.md) 12 | 13 | ## Prerequisites: 14 | 15 | ### Prerequisites for developing the Sync Profile App: 16 | School Data Sync Profile APIs can be integrated with a 3rd party app or a student information system (SIS) solution. To enable this integration, the app must meet the 17 | the following prerequisites: 18 | 19 | 1. The Client App is registered with Azure Active Directory. 20 | 21 | To create an app that can be used by multiple EDU tenants, the recommendation is to build a multi-tenant SaaS web application using Azure AD and OpenId Connect. Following the guidelines and a sample app published [here](https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-devhowto-multi-tenant-overview) to register this app with Azure AD. 22 | 23 | 24 | 25 | 2.. Request permissions in the app to manage synchronization profiles. 26 | 27 | To enable the app to create and manage synchronization profiles, the app needs to request permissions mentioned below in Azure AAD. The school IT admin will be responsible for granting these permissions. 28 | 29 | - Navigate to the newly registered app in Azure portal, go to app settings and select 'Required Permissions' 30 | 31 | ![](./Images/Settings.PNG) 32 | 33 | - Select 'Add' and chose 'Graph API' 34 | 35 | ![](./Images/AddGraphAPI.PNG) 36 | 37 | - Select one of the following 'delegated' permissions: 38 | - 'Manage education app settings' - For scenarios that require read-write permissions 39 | - 'Read education app settings' - For scenarios that require read-only permissions. 40 | 41 | Please refer to the API documentation to identify the scopes for the corresponding APIs. 42 | 43 | ![](./Images/AddPermissions.PNG) 44 | 45 | 3. Authorization token needed to call the SDS APIs needs to be acquired in the user context. The resource the token is requested for should be "https://graph.microsoft.com". 46 | 47 | ### Prerequisites for running the App 48 | 49 | Once the app is deployed, School IT can setup automated sync profiles. Here are the prerequisites for running the app. 50 | 51 | 1. Access to EDU Tenant Admin subscription: Ensure the IT admin has access to the Admin account of the EDU subscription. The IT admin needs to login to Azure portal (from Office admin center). 52 | 53 | 2. Grant the consent for permissions requested by the app : Login to the grant the permissions that are requested by the app to create and manage sync profiles. 54 | 55 | Once you have successfully met the prerequisites for creating an app, you are ready to explore the scenarios supported the Sync Profile APIs. 56 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). 40 | 41 | 42 | --------------------------------------------------------------------------------