如何使用Power shell使用Get-Credentials进行身份验证,从OneDrive下载文件?

时间:2017-11-28 21:45:12

标签: powershell command-line onedrive downloading

这是我现在正在使用的代码,它已经过测试工作以下载文件,但是如果需要身份验证(例如一个驱动器),我无法进行身份验证和下载文件。我的代码在这里:

    $CheckFile = Test-Path "$PSScriptRoot\5.2.0\Content Manager Setup.exe"
if ($CheckFile) {exit} else {$colorscheme = (Get-Host).PrivateData
$colorscheme.ProgressBackgroundColor = "black"
$colorscheme.ProgressForegroundColor = "red"
 Function MakingProgress
 {
param(
    [Parameter(Mandatory=$true)]
    [String] $url,
    [Parameter(Mandatory=$false)]
    [String] $localFile = (Join-Path $pwd.Path $url.SubString($url.LastIndexOf('/'))) 
)

begin {
    $client = New-Object System.Net.WebClient
    $Global:downloadComplete = $false
    $eventDataComplete = Register-ObjectEvent $client DownloadFileCompleted `
        -SourceIdentifier WebClient.DownloadFileComplete `
        -Action {$Global:downloadComplete = $true}
    $eventDataProgress = Register-ObjectEvent $client DownloadProgressChanged `
        -SourceIdentifier WebClient.DownloadProgressChanged `
        -Action { $Global:DPCEventArgs = $EventArgs }    
}
process {
    Write-Progress -Activity 'Downloading file' -Status $url
    $client.Credentials =  Get-Credential
    $client.DownloadFileAsync($url, $localFile)

    while (!($Global:downloadComplete)) {                
        $pc = $Global:DPCEventArgs.ProgressPercentage
        if ($pc -ne $null) {
            Write-Progress -Activity 'Downloading file' -Status $url -PercentComplete $pc
        }
    }

    Write-Progress -Activity 'Downloading file' -Status $url -Complete
}
end {
    Unregister-Event -SourceIdentifier WebClient.DownloadProgressChanged
    Unregister-Event -SourceIdentifier WebClient.DownloadFileComplete
    $client.Dispose()
    $Global:downloadComplete = $null
    $Global:DPCEventArgs = $null
    Remove-Variable client
    Remove-Variable eventDataComplete
    Remove-Variable eventDataProgress
    [GC]::Collect()    
} 
 }
$SRC = "https://fourwindsinteractivehq-my.sharepoint.com/personal/sameer_chopra_fourwindsinteractive_com/_layouts/15/guestaccess.aspx?docid=115e84d95a5944c1995b56e4f738fdde9&authkey=AU7hSoQX7TXgk1Pb2rLhPIk&expiration=2017-12-14T17%3A29%3A32.000Z&e=19981f1187a447ad8bd4b6e3cb46e9f9"
$DEST = "5.2.0\Content Manager Setup.exe"
MakingProgress $SRC $DEST}

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:6)

为什么Get-Credential无法自行运行

要从OneDrive下载文件,您将无法像System.Management.Automation.PSCredential那样只在Get-Credential对象中提供您的用户名/密码。

使用在线服务时,您必须将权限委派给应用程序(在本例中为PowerShell脚本),这将为您提供可用于下载文件的令牌。最流行的凭证授权形式之一是oAuth。如果您想学习如何自己处理oAuth /类似委托,我会在this blog post here中介绍oAuth基础知识。

一般来说,你不会想要推出自己的oAuth解决方案,特别是如果其他人已经为你做过这样的话。

方便的替代方案

幸运的是,Marcel Meurer已经为OneDrive编写了一个PowerShell模块,它可以处理所有重要的凭证授权并为您登录!他在his post here谈到了。

使用以下

安装模块
Install-Module -Name OneDrive 

接下来,您可以使用以下两个cmdlet创建一小时令牌。

$Authentication=Get-ODAuthentication -ClientID "00000000…….."

$AuthToken=$Authentication.access_token

这将启动一个GUI窗口,您可以在其中使用OneDrive凭据登录并将其分配给令牌。

完成后,您可以使用以下语法

下载文件
Get-ODItem -AccessToken $AuthToken -Path "/Data/documents/2016/Powershell array custom objects.docx"

这会将文件下载到您当前的文件夹中。有关使用此模块的其他示例check out Marcel's blog post,其中包含大多数用例的深入示例,包括如何处理过期令牌。