Использовать общий доступ к файлам Azure в PowerShell Runbook - PullRequest
0 голосов
/ 09 января 2019

Я создал общий файловый ресурс 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?

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

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Обновление: рекурсивное копирование всех файлов и папок в $ 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

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

enter image description here

Моя структура файловых ресурсов на портале Azure:

enter image description here

0 голосов
/ 09 января 2019

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...