Использование файлового ресурса Azure в PowerShell Runbook

Я создал общую папку az Azure, в которой я хотел бы хранить несколько файлов подготовки SharePoint, шаблонов и XML. Файлы скопированы в общий ресурс и готовы к использованию.

Мне известно о команде Get-AzureStorageFileContent, которую можно использовать для получения отдельных файлов, но мне нужно видеть этот общий ресурс как общий, поскольку на файлы ссылаются из шаблона подготовки PnP, например:

  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="webparts\head.xml"/>

Это отлично работает, когда я запускаю сценарий локально или из общего сетевого ресурса. Итак, мой вопрос: как я могу использовать путь UNC или сопоставить его как сетевой диск?

Согласно документации, я могу использовать его как общий ресурс smb, но когда я пытаюсь подключиться, я получаю эту ошибку:

New-SmbMapping: Не удается подключиться к серверу CIM. Указанная служба не существует как установленная служба.

New-PSDrive не существует в Azure Powershell. Я нашел это как модуль в Azure, но перестал устанавливать зависимости, когда одна из них требовала обновления .Net в Azure.

Может ли кто-нибудь дать мне полное руководство, как я могу добиться реальной функциональности общего доступа к файлам с помощью Azure File Share?

Изменить: и приемлемым обходным путем было бы, если бы я мог скопировать все файлы из общего ресурса в текущую временную папку, потому что оттуда я мог получить к ним доступ с помощью $env:TEMP.


person vilmarci    schedule 09.01.2019    source источник
comment
Насколько я понимаю, в модуле Runbook вы хотите получить доступ к общей папке через UNC-путь? или скопировать все файлы из файлового хранилища в $ env: temp? Если я что-то не понимаю, поправьте меня.   -  person Ivan Yang    schedule 10.01.2019
comment
да. Если возможно, я бы хотел, чтобы все функции в модуле Runbook могли использовать общий ресурс так же, как они использовали бы обычный сетевой ресурс. Если это невозможно, то я хотел бы скопировать все в temp и работать оттуда.   -  person vilmarci    schedule 10.01.2019
comment
Содержит ли общий файловый ресурс каталоги или просто файлы?   -  person Ivan Yang    schedule 10.01.2019
comment
И файлы, и папки.   -  person vilmarci    schedule 10.01.2019
comment
Хорошо, я обновлю свой ответ позже.   -  person Ivan Yang    schedule 10.01.2019


Ответы (2)


Обновление: рекурсивно скопируйте все файлы и папки в $ env: temp

Код в модуле Runbook PowerShell:

function Get-AzureFiles
{
param([string]$filesharename = 'testfolder', #replace with your own fileshare name
      [string]$username = 'your account name',
      [string]$password = 'your account key', 
      [string]$destination=$env:TEMP+"\", #note there is a slash at the end
      [string]$path="")

      $temp = $env:TEMP

      # get the context
      $context = New-AzureStorageContext -StorageAccountName $username -StorageAccountKey $password

      # get all files and directories
      if($path -eq "")
      {
      $content = Get-AzureStorageFile -ShareName $filesharename -Context $context
      }
      else
      {
      $content = Get-AzureStorageFile -ShareName $filesharename -Context $context -Path $path | Get-AzureStorageFile
      }

      if(!(test-path $destination))
        {
        mkdir $destination
        }

      foreach($c in $content)
      {
        $p = $c.uri.LocalPath -replace "$($c.share.name)/" ,''
        #write-host "the value p is: $p"

        #if it's a directory in fileshare
        if($c.gettype().name -eq "CloudFileDirectory")
        {
           # Write-Host "$($c.share.name) is a directory"
            $destination =$temp + $c.uri.PathAndQuery -replace "/","\"

            #create the folder locally
            if(!(test-path $destination))
            {
            mkdir $destination
            #write-host "the new directory $destination is created locally."
            }

            #define the folder path in fileshare
            $path = ($c.uri.localpath -replace "/$filesharename/" , "") -replace "/","\"

            Get-AzureFiles -destination $destination -path $path

        }
        #if it's a file
        elseif($c.gettype().name -eq "CloudFile")
        {         
         $s = $temp + $c.uri.PathAndQuery -replace "/","\"
         #Write-Output "downloading --- $s"

         $d1 = $c.uri.PathAndQuery -replace "/","\"
         $d1 = $d1.remove($d1.LastIndexOf("\")+1)

         $destination =$temp + $d1



            #create the folder locally
            if(!(test-path $destination))
            {
            mkdir $destination
            #write-host "the new directory $destination is created locally."
            }
         $path_temp = $c.uri.PathAndQuery -replace "/$filesharename/",""

         Get-AzureStorageFileContent -ShareName $filesharename -Path $path_temp  -Destination $destination -Context $context        
        }
      }
}


function do-test
{
get-AzureFiles

# you can operate the files copied to $env:temp
dir $env:TEMP\testfolder
dir $env:TEMP\testfolder\t1
dir $env:TEMP\testfolder\t1\t1sub
}

do-test

Результат теста:

введите здесь описание изображения

Моя структура общего доступа к файлам на лазурном портале:

введите здесь описание изображения

person Ivan Yang    schedule 10.01.2019
comment
Спасибо, это хорошо работает с файлами в корне. Есть ли шанс получить все, файлы, папку рекурсивно? - person vilmarci; 10.01.2019
comment
Я работаю над этим и сообщу вам, когда появятся обновления :) - person Ivan Yang; 10.01.2019
comment
@vilmarci, я обновил свой ответ, рекурсивно копирую все файлы и папки в общий доступ к файлам. Если это сработает для вас, помогите отметить это как ответ. Спасибо:) - person Ivan Yang; 11.01.2019
comment
Спасибо за помощь. Папки создаются, но никакие файлы (кроме тех, что находятся в корне) не копируются. Я вижу сообщение об ошибке после каждой папки: ERROR: New-AzureStorageContext : Invalid length for a Base-64 char array or string. Я включил выходы в вашем коде, я никогда не вижу часть загрузки ... - person vilmarci; 11.01.2019
comment
Нашел: в этой строке Get-AzureFiles -destination $destination -path $path также нужно передать контекст и имя файлового ресурса. Кроме того, возникают трудности, когда путь содержит пробелы и закодирован до% 20, они должны быть декодированы, но с этого момента я могу справиться с этим. В остальном это идеально, большое спасибо. - person vilmarci; 11.01.2019

Похоже, полученная вами ошибка связана с разрешениями на DNS-сервере, это Thread предоставляет следующее решение:

добавьте эти две роли: DnsAdmins и WinRMRemoteWMIUsers__ на DNS-сервере / DC. затем на DNS-сервере следующее:

* 1. Откройте консоль управления компьютером. Щелкните правой кнопкой мыши элемент управления WMI (в разделе «Службы и приложения») и выберите свойство. 2. В открывшемся окне щелкните вкладку «Безопасность».

  1. Разверните корневое дерево, затем щелкните узел CIMV2 и нажмите кнопку безопасности.
  2. Во вновь открывшемся окне нажмите кнопку «Дополнительно».
  3. Во вновь открытом окне нажмите кнопку «Добавить» на вкладке разрешений.
  4. Во вновь открывшемся окне нажмите «Выбрать участника», затем найдите и добавьте группу WinRMRemoteWMIUsers__ в качестве участника, затем нажмите «ОК».
  5. В разделе «Применяется к» выберите «это пространство имен и подпространство имен».
  6. Чтобы получить разрешение, отметьте «Выполнить методы», «Включить учетные записи» и «Включить удаленное управление».
  7. Трижды нажмите ОК.
  8. Затем перейдите к узлу Root - Microsoft - Windows - DNS. Сделайте то же самое, добавьте разрешение для WinRMRemoteWMIUsers.
  9. Перезапустите службу «Инструментарий управления Windows.
  10. Проверьте, устранена ли проблема. *

Это полный официальный документация, в которой также описаны действия по локальному подключению диска.

person Adam Smith - Microsoft Azure    schedule 09.01.2019
comment
Это модуль runbook ps в Azure, а не локальный. - person vilmarci; 10.01.2019