使用 Graph 通过 Powershell 将使用条款 PDF 上传到 Azure

Uploading a Terms of Use PDF via Powershell to Azure using Graph

我刚刚开始尝试使用 MgGraph 模块来尝试在 Office 365 租户上执行操作以执行一些配置自动化,但我很难理解其中的一些 cmdlet - 特别是,我目前正在处理的那个 New-MgAgreement,试图自动上传使用条款文件。

我想,对于初学者来说,这是实现这一目标的可行途径吗?我应该尝试使用其他方法来尝试完成此操作吗?如果没有,我想我该怎么做呢?简而言之,这就是我尝试过的:

  1. 我正在通过 Windows 表单使用文件选择器来提示捕获我要上传的文件
  2. 我已经为 cmdlet 的 File 参数创建了一个散列以满足所需的属性(我认为...),并填写了提供有关正在创建的使用条款对象的信息所需的其他参数在租户上
  3. 当我尝试 运行 命令时,我最初被告知“value cannot be null - parameter name source” 这是有道理的,因为我没有在物理文件的文档中看到任何指定源的参数,所以我尝试简单地向 New-MgAgreement cmdlet 添加一个“source”参数,以为我只是在文档中错过了它,但在尝试这样做时,它告诉我“a parameter cannot be found that matches parameter name 'source'.

只是为了让您了解我在尝试实现此目标时的心态,这是一个代码片段,希望能说明我正在尝试这样做的方向:

Function Main {
    Connect-Modules
    Set-Tenant-Terms-Of-Use
    Get-Tenant-Terms-Of-Use
}

Function Connect-Modules {
    Connect-AzureAD
    $tenantId = Get-AzureADTenantDetail | Select-Object ObjectId
    C:\Windows\System32\cmd.exe /c start shell:AppsFolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge -private https://microsoft.com/devicelogin
    Connect-MgGraph -Scopes "User.Read.All", "Group.ReadWrite.All", "Agreement.Read.All", "Agreement.ReadWrite.All" -TenantId $tenantId.ObjectId.ToString()
}

Function Set-Tenant-Terms-Of-Use {
    $FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{ 
        InitialDirectory = [Environment]::GetFolderPath('Desktop')
        Filter = 'PDF (*.pdf)|*.pdf'
    }
    $companyName = Read-Host "Please enter your company name: "
    $null = $FileBrowser.ShowDialog()
    $fileHash = @{
        DisplayName = "All users terms of use";
        FileName = $FileBrowser.SafeFileName
        IsDefault = $true
        IsMajorVersion = $true
        Language = "English (Default)"
    }
    New-MgAgreement -DisplayName "$companyName Terms of Use" -File $fileHash -source $FileBrowser.FileName
}

Function Get-Tenant-Terms-Of-Use {
    $termsOfUse = Get-MgAgreement | Select-Object Id, DisplayName
    Write-Host $termsOfUse.Id.ToString()
    Write-Host $termsOfUse.DisplayName.ToString()
}

Main
Disconnect-MgGraph

我承认...我完全迷失在这个问题上 - 我以前没有真正使用过 Graph,我正在尝试掌握它,因为它似乎有很多挂钩到 Azure/O365 租户区域的功能,而我习惯使用的其他模块则没有。我很感激我能得到关于这个话题的任何教育!谢谢!

编辑 - 所以我可以通过 Graph Explorer 以我想要的方式工作...我意识到我需要将我的文件转换为 base64 并将值放在 FileData 参数下的数据 属性 下从文件参数中...但是当我尝试使用与 Graph Explorer 中包含的参数值相同的参数值在 PowerShell 中对此进行镜像时,我只得到一个 "New-MgAgreement: Value cannot be null. Parameter name: source"... 所以只是我不知道如何使用 cmdlet 对其进行格式化...我只是无法理解如何使用显然已给出文档的复杂参数。

我能够重现这个问题。作为替代方案,您可以使用 Invoke-MgGraphRequest 传递协议端点并上传协议 - 这对我有用,请参见下文:

Agreement Resource Sample Data

$data 
{
  "displayName": "MSGraph Sample",
  "isViewingBeforeAcceptanceRequired": true,
  "files": [
    {
      "fileName": "TOU.pdf",
      "language": "en",
      "isDefault": true,
      "fileData": {
        "data": "SGVsbG8gd29ybGQ="
      }
    }
  ]
}
#Using IGR
Invoke-MgGraphRequest  -Uri https://graph.microsoft.com/v1.0/agreements -Method POST -Body $data

如果这对您有帮助,或者您还有其他问题,请告诉我。