Настройка ядра PowerShell из ядра .net для выделения одного диска

Я пытаюсь подготовить один диск в приложении ядра dotnet с помощью ядра PowerShell. Запуск powershell Я смог успешно подготовить один диск из командной строки powershell, следуя инструкциям, приведенным ниже:

https://docs.microsoft.com/en-us/onedrive/pre-provision-accounts

Запускать его программно в ядре .net, однако похоже, что он использует отдельную оболочку PowerShell, которая встроена в ядро ​​.net 2.1.

Я считаю, что неудачные запуски приложений связаны с неправильной настройкой Powershell в комплекте с ядром, а именно с первыми 3 шагами в приведенной выше ссылке:

1. Загрузите последнюю версию командной консоли SharePoint Online.

2. Загрузите и установите SDK клиентских компонентов SharePoint Online.

3. Подключитесь к SharePoint Online в качестве глобального администратора или администратора SharePoint в Office 365. Чтобы узнать, как это сделать, см. Раздел «Начало работы с командной консолью SharePoint Online».

Как настроить PowerShell, запускаемое моим приложением, для отражения описанных выше шагов?

Мой код выглядит так:

using System.IO;
using System.Management.Automation;

namespace PowerShellApp
{
    class Program
    {
        public static int Main(string[] args)
        {
            using (PowerShell ps = PowerShell.Create(
            {
                ps.AddScript(File.ReadAllText(<scriptLocation>))
                    .Invoke();
            }
        }
        return 0;
    }
}

Как выполнить эти шаги при выполнении в основном приложении .net

Скрипт PowerShell, который я запускаю, находится ниже, а также по ссылке выше:

<#
.SYNOPSIS
 This script adds an entry for each user specified in the input file 
 into the OneDrive provisioning queue

.DESCRIPTION
 This script reads a text file with a line for each user. 
 Provide the User Principal Name of each user on a new line.
 An entry will be made in the OneDrive provisioning queue for each
 user up to 200 users.
.EXAMPLE
 .\BulkEnqueueOneDriveSite.ps1 -SPOAdminUrl https://contoso-    admin.sharepoint.com -InputfilePath C:\users.txt 
.PARAMETER SPOAdminUrl
 The URL for the SharePoint Admin center
 https://contoso-admin.sharepoint.com
.PARAMETER InputFilePath
 The path to the input file.
 The file must contain 1 to 200 users
 C:\users.txt
.NOTES
 This script needs to be run by a global or SharePoint administrator in Office 365
 This script will prompt for the username and password of the administrator
#>
param
(
    #Must be SharePoint Administrator URL
    [Parameter(Mandatory = $true)]
    [ValidateNotNullOrEmpty()]
    [string] $SPOAdminUrl,

    [Parameter(Mandatory = $true)]
    [ValidateNotNullOrEmpty()]
    [string] $InputFilePath
)
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")     | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.R    untime") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.U    serProfiles") | Out-Null
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SPOAdminUrl)
$Users = Get-Content -Path $InputFilePath
if ($Users.Count -eq 0 -or $Users.Count -gt 200)
{
    Write-Host $("Unexpected user count: [{0}]" -f $Users.Count) -    ForegroundColor Red
    return 
}
$web = $ctx.Web
Write-Host "Enter an admin username" -ForegroundColor Green
$username = Read-Host
Write-Host "Enter your password" -ForegroundColor Green
$password = Read-Host -AsSecureString
$ctx.Credentials = New-Object     Microsoft.SharePoint.Client.SharePointOnlineCredentials($username,$password )
$ctx.Load($web)
$ctx.ExecuteQuery()
$loader =     [Microsoft.SharePoint.Client.UserProfiles.ProfileLoader]::GetProfileLoader($ctx)
$ctx.ExecuteQuery()
$loader.CreatePersonalSiteEnqueueBulk($Users)
$loader.Context.ExecuteQuery()
Write-Host "Script Completed"

person Alan Nguyen    schedule 30.11.2018    source источник
comment
Вы хотите перевести Powershell в .net?   -  person Mike Twc    schedule 03.12.2018
comment
У нас действительно была реализация этого, но возникла проблема с неправильной загрузкой dll, поэтому мы перешли на выполнение Powershell Core. Если бы я мог просто выяснить, как настроить PowerShell, который выполняет ядро ​​.net, это решило бы наши проблемы.   -  person Alan Nguyen    schedule 03.12.2018
comment
Я все еще не на 100% понимаю, в чем проблема. Речь идет о переключении вашего скрипта / фрагмента с PowerShell на ядро ​​PowerShell?   -  person Mike Twc    schedule 03.12.2018
comment
Верно, поэтому ссылка выше содержит пару шагов, которые выглядят так, как будто она устанавливает пару вещей на мой локальный компьютер, оболочку онлайн-управления sharepoint и sdks клиента sharepoint. В этой установке он настраивает PowerShell на моем компьютере для использования новых библиотек. Третий шаг - связать эту оболочку с учетной записью администратора. Однако, когда я выполняю свой код, похоже, что у .net core есть собственный экземпляр PowerShell, который не настроен. Я знаю это, потому что, когда я запускаю команду a, чтобы получить версию powershell локально, а не в коде dotnet, они возвращают разные версии.   -  person Alan Nguyen    schedule 03.12.2018
comment
Вы собираетесь запускать это приложение в Linux? Интересно, почему вы переходите на ядро   -  person Mike Twc    schedule 04.12.2018


Ответы (1)


Боюсь, SP Online Management Shell зависит от .Net Framework и не будет работать с Core (проверьте это). С другой стороны, этот модуль казался оберткой над их REST API. Поэтому, если вы хотите интегрировать его с приложением Core, вы можете попробовать заменить его HTTP-запросами. Проверьте эту документацию

Кроме того, ниже представлен базовый сценарий PowerShell для работы с этими конечными точками REST API. Я тестировал это на своем сайте:

$baseUrl = "http://sharepoint.com/sites/yourSite/_api"
$cred = Get-Credential

# retreive digest
$r = Invoke-WebRequest -Uri "$baseUrl/contextinfo" -Method Post -Credential $cred -SessionVariable sp
$digest = ([xml]$r.content).GetContextWebInformation.FormDigestvalue

# calling endpoint

$endpoint = "sp.userprofiles.profileloader.getprofileloader/getuserprofile"

$head = @{
 "Accept" = "application/json;odata=verbose"
 "X-RequestDigest" = $digest
 }

$re = Invoke-WebRequest -Uri "$baseUrl/$endpoint" -Headers $head -Method Post -WebSession $sp

Write-Host $re.Content

Это фрагмент для createpersonalsiteenqueuebulk, но я не могу его протестировать, так как я не администратор домена. Надеюсь, это сработает для вас

 #--- sample 2 (didn't test it since I'm not domain admin). Might need separate session/digest

$endpoint2 = "https://<domain>-admin.sharepoint.com/_api/sp.userprofiles.profileloader.getprofileloader/createpersonalsiteenqueuebulk"

$head = @{
 "Accept" = "application/json;odata=verbose"
 "X-RequestDigest" = $digest
 }

$body =  "{ 'emailIDs': ['[email protected]', '[email protected]'] }"
$re2 = Invoke-WebRequest -Uri "$endpoint2" -Headers $head -body $body -Method Post -WebSession $sp
Write-Host $re2.Content
person Mike Twc    schedule 03.12.2018