Rozszerzenie niestandardowego skryptu dla systemu Windows

Rozszerzenie niestandardowego skryptu pobiera i uruchamia skrypty na maszynach wirtualnych platformy Azure. To rozszerzenie służy do konfigurowania po wdrożeniu, instalacji oprogramowania lub innego zadania konfiguracji lub zarządzania. Skrypty można pobrać z usługi Azure Storage lub GitHub albo udostępnić je w witrynie Azure Portal w środowisku uruchomieniowym rozszerzenia.

Rozszerzenie niestandardowego skryptu integruje się z szablonami usługi Azure Resource Manager. Można go również uruchomić przy użyciu interfejsu wiersza polecenia platformy Azure, programu Azure PowerShell, witryny Azure Portal lub interfejsu API REST usługi Azure Virtual Machines.

W tym artykule opisano sposób używania rozszerzenia niestandardowego skryptu przy użyciu modułu Azure PowerShell i szablonów usługi Azure Resource Manager. Zawiera on również kroki rozwiązywania problemów dla systemów Windows.

Wymagania wstępne

Uwaga

Nie używaj rozszerzenia niestandardowego skryptu do uruchamiania Update-AzVM z tą samą maszyną wirtualną co jej parametr. Rozszerzenie będzie czekać na siebie.

Obsługiwane systemy operacyjne Windows

System operacyjny Windows x64
Windows 10 Obsługiwane
Windows 11 Obsługiwane
Windows Server 2008 SP2 Obsługiwane
Windows Server 2008 R2 Obsługiwane
Windows Server 2012 Obsługiwane
Windows Server 2012 R2 Obsługiwane
System Windows Server 2016 Obsługiwane
Windows Server 2016 Core Obsługiwane
Windows Server 2019 Obsługiwane
Windows Server 2019 Core Obsługiwane
Windows Server 2022 Obsługiwane
Windows Server 2022 Core Obsługiwane

Lokalizacja skryptu

Możesz ustawić rozszerzenie tak, aby używało poświadczeń usługi Azure Blob Storage w celu uzyskania dostępu do usługi Azure Blob Storage. Lokalizacja skryptu może znajdować się w dowolnym miejscu, jeśli maszyna wirtualna może kierować do tego punktu końcowego, na przykład do usługi GitHub lub wewnętrznego serwera plików.

Łączność z Internetem

Aby pobrać skrypt zewnętrznie, na przykład z usługi GitHub lub Usługi Azure Storage, musisz otworzyć inne porty zapory lub sieciowej grupy zabezpieczeń. Jeśli na przykład skrypt znajduje się w usłudze Azure Storage, możesz zezwolić na dostęp przy użyciu tagów usługi Azure NSG dla usługi Storage.

Rozszerzenie niestandardowego skryptu nie ma możliwości obejścia weryfikacji certyfikatu. W przypadku pobierania z zabezpieczonej lokalizacji z certyfikatem z podpisem własnym mogą wystąpić błędy, takie jak Certyfikat zdalny jest nieprawidłowy zgodnie z procedurą weryfikacji. Upewnij się, że certyfikat jest poprawnie zainstalowany w magazynie zaufanych głównych urzędów certyfikacji na maszynie wirtualnej.

Jeśli skrypt znajduje się na serwerze lokalnym, może być konieczne otwarcie innych zapór lub portów sieciowej grupy zabezpieczeń.

Wskazówki

  • Dane wyjściowe są ograniczone do ostatnich 4096 bajtów.
  • Prawidłowe znaki ucieczki pomogą upewnić się, że ciągi są poprawnie analizowane. Na przykład zawsze potrzebne są dwa ukośniki odwrotne, aby uniknąć pojedynczego ukośnika odwrotnego literału podczas pracy ze ścieżkami plików. Przykład: {"commandToExecute": "C:\\Windows\\System32\\systeminfo.exe >> D:\\test.txt"}
  • Najwyższy odsetek awarii dotyczących tego rozszerzenia jest spowodowany błędami składni w skrypcie. Sprawdź, czy skrypt działa bez błędów. Umieść więcej logowania do skryptu, aby ułatwić znajdowanie błędów.
  • Pisz skrypty idempotentne, aby w razie ich ponownego uruchomienia przez przypadek więcej niż jeden raz nie nastąpiły zmiany systemu.
  • Upewnij się, że skrypty nie wymagają udziału użytkownika w trakcie działania.
  • Dozwolone jest działanie skryptu przez 90 minut. Każdy dłuższy czas spowoduje niepowodzenie aprowizacji rozszerzenia.
  • Nie umieszczaj w skrypcie operacji ponownego uruchamiania. Ta akcja powoduje problemy z innymi zainstalowanymi rozszerzeniami, a rozszerzenie nie będzie kontynuowane po ponownym uruchomieniu.
  • Jeśli masz skrypt, który powoduje ponowne uruchomienie przed zainstalowaniem aplikacji i uruchomieniem skryptów, zaplanuj ponowne uruchomienie przy użyciu zadania Windows Scheduled Task lub przy użyciu narzędzi, takich jak rozszerzenia DSC, Chef lub Puppet.
  • Nie uruchamiaj skryptu, który powoduje zatrzymanie lub aktualizację agenta maszyny wirtualnej. Może to pozostawić rozszerzenie w stanie przejściowym i prowadzić do przekroczenia limitu czasu.
  • Rozszerzenie uruchomi skrypt tylko raz. Jeśli chcesz uruchamiać skrypt przy każdym rozruchu, użyj rozszerzenia w celu utworzenia zaplanowanego zadania systemu Windows.
  • Jeśli chcesz zaplanować czas uruchomienia skryptu, użyj rozszerzenia w celu utworzenia zaplanowanego zadania systemu Windows.
  • W trakcie działania skryptu będziesz widzieć tylko stan przechodzenie z witryny Azure Portal lub interfejsu wiersza polecenia Azure. Jeśli potrzebujesz częstszych aktualizacji stanu działającego skryptu, musisz utworzyć własne rozwiązanie.
  • Niestandardowe rozszerzenie skryptu nie obsługuje natywnie serwerów proxy. Jednak możesz w swoim skrypcie użyć narzędzia do transferu plików, np. Invoke-WebRequest, które obsługuje serwery proxy w ramach tego skryptu, takiego jak Curl.
  • Pamiętaj, że skrypty lub polecenia mogą polegać na lokalizacjach katalogów innych niż domyślne. Przygotuj logikę obsługującą taką sytuację.
  • Rozszerzenie niestandardowego skryptu jest uruchamiane na koncie LocalSystem.
  • Jeśli planujesz używać właściwości storageAccountName i storageAccountKey, te właściwości muszą być sortowane w pliku protectedSettings.
  • Do maszyny wirtualnej można zastosować tylko jedną wersję rozszerzenia. Aby uruchomić drugi skrypt niestandardowy, zaktualizuj istniejące rozszerzenie przy użyciu nowej konfiguracji. Alternatywnie możesz usunąć rozszerzenie niestandardowego skryptu i ponownie zastosować go za pomocą zaktualizowanego skryptu.

Schemat rozszerzenia

Konfiguracja rozszerzenia niestandardowego skryptu określa elementy, takie jak lokalizacja skryptu i polecenie do uruchomienia. Tę konfigurację można przechowywać w plikach konfiguracji, określić ją w wierszu polecenia lub określić w szablonie usługi Azure Resource Manager.

Poufne dane można przechowywać w chronionej konfiguracji, która jest szyfrowana i odszyfrowywane tylko wewnątrz maszyny wirtualnej. Konfiguracja chroniona jest przydatna, gdy polecenie wykonywania zawiera wpisy tajne, takie jak hasło lub odwołanie do pliku sygnatury dostępu współdzielonego (SAS). Oto przykład:

{
    "apiVersion": "2018-06-01",
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "name": "virtualMachineName/config-app",
    "location": "[resourceGroup().location]",
    "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachines/', variables('vmName'),copyindex())]",
        "[variables('musicstoresqlName')]"
    ],
    "tags": {
        "displayName": "config-app"
    },
    "properties": {
        "publisher": "Microsoft.Compute",
        "type": "CustomScriptExtension",
        "typeHandlerVersion": "1.10",
        "autoUpgradeMinorVersion": true,
        "settings": {
            "timestamp":123456789
        },
        "protectedSettings": {
            "commandToExecute": "myExecutionCommand",
            "storageAccountName": "myStorageAccountName",
            "storageAccountKey": "myStorageAccountKey",
            "managedIdentity" : {},
            "fileUris": [
                "script location"
            ]
        }
    }
}

Uwaga

Właściwość managedIdentitynie może być używana w połączeniu z właściwością storageAccountName or storageAccountKey .

Na maszynie wirtualnej można zainstalować tylko jedną wersję rozszerzenia. Określanie skryptu niestandardowego dwa razy w tym samym szablonie usługi Azure Resource Manager dla tej samej maszyny wirtualnej kończy się niepowodzeniem.

Tego schematu można użyć wewnątrz zasobu maszyny wirtualnej lub jako zasobu autonomicznego. Jeśli to rozszerzenie jest używane jako zasób autonomiczny w szablonie usługi Azure Resource Manager, nazwa zasobu musi być w formacie virtualMachineName/extensionName.

Wartości właściwości

Nazwisko Wartość lub przykład Typ danych
apiVersion 2015-06-15 data
Wydawca Microsoft.Compute string
type CustomScriptExtension string
typeHandlerVersion 1.10 int
fileUris https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/scripts/configure-music-app.ps1 tablica
timestamp 123456789 32-bitowa liczba całkowita
commandToExecute powershell -ExecutionPolicy Unrestricted -File configure-music-app.ps1 string
storageAccountName examplestorageacct string
storageAccountKey TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg== string
managedIdentity { }lub lub { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" }{ "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" } Obiekt JSON

Uwaga

Te nazwy właściwości są uwzględniane w wielkości liter. Aby uniknąć problemów z wdrażaniem, użyj nazw, jak pokazano tutaj.

Szczegóły wartości właściwości

Właściwości Opcjonalne lub wymagane Szczegóły
fileUris Opcjonalnie Adresy URL plików do pobrania. Jeśli na przykład adresy URL są poufne, jeśli zawierają klucze, to pole powinno być określone w pliku protectedSettings.
commandToExecute Wymagania Skrypt punktu wejścia do uruchomienia. Użyj tej właściwości, jeśli polecenie zawiera wpisy tajne, takie jak hasła lub jeśli identyfikatory URI pliku są poufne.
timestamp Opcjonalnie Zmień tę wartość tylko, aby wyzwolić ponowne uruchomienie skryptu. Dowolna wartość całkowita jest akceptowalna, o ile różni się od poprzedniej wartości.
storageAccountName Opcjonalnie Nazwa konta magazynu. Jeśli określisz poświadczenia magazynu, wszystkie fileUris wartości muszą być adresami URL dla obiektów blob platformy Azure.
storageAccountKey Opcjonalnie Klucz dostępu konta magazynu.
managedIdentity Opcjonalnie Tożsamość zarządzana do pobierania plików. Prawidłowe wartości to clientId (opcjonalnie, ciąg), czyli identyfikator klienta tożsamości zarządzanej oraz objectId (opcjonalnie, ciąg), czyli identyfikator obiektu tożsamości zarządzanej.

Ustawienia publiczne są wysyłane w postaci zwykłego tekstu do maszyny wirtualnej, na której jest uruchamiany skrypt. Ustawienia chronione są szyfrowane za pośrednictwem klucza znanego tylko dla platformy Azure i maszyny wirtualnej. Ustawienia są zapisywane na maszynie wirtualnej podczas ich wysyłania. Oznacza to, że jeśli ustawienia zostały zaszyfrowane, są one zapisywane jako zaszyfrowane na maszynie wirtualnej. Certyfikat używany do odszyfrowywania zaszyfrowanych wartości jest przechowywany na maszynie wirtualnej. Certyfikat jest również używany do odszyfrowywania ustawień, w razie potrzeby, w czasie wykonywania.

Używanie ustawień publicznych może być przydatne do debugowania, ale zalecamy używanie ustawień chronionych.

Następujące wartości można ustawić w ustawieniach publicznych lub chronionych. Rozszerzenie odrzuca dowolną konfigurację, w której te wartości są ustawiane zarówno w ustawieniach publicznych, jak i chronionych.

  • commandToExecute
  • fileUris

Właściwość: managedIdentity

Uwaga

Ta właściwość musi być określona tylko w ustawieniach chronionych.

Rozszerzenie niestandardowego skryptu w wersji 1.10 lub nowszej obsługuje tożsamości zarządzane do pobierania plików z adresów URL podanych w ustawieniu fileUris . Właściwość umożliwia rozszerzenie niestandardowego skryptu uzyskiwanie dostępu do prywatnych obiektów blob lub kontenerów usługi Azure Storage bez konieczności przekazywania wpisów tajnych, takich jak tokeny SAS lub klucze konta magazynu.

Aby użyć tej funkcji, dodaj tożsamość przypisaną przez system lub przypisaną przez użytkownika do maszyny wirtualnej lub zestawu skalowania maszyn wirtualnych, w którym jest uruchamiane rozszerzenie niestandardowego skryptu. Następnie przyznaj tożsamości zarządzanej dostęp do kontenera lub obiektu blob usługi Azure Storage.

Aby użyć tożsamości przypisanej przez system na docelowej maszynie wirtualnej lub zestawie skalowania maszyn wirtualnych, ustaw na managedidentity pusty obiekt JSON.

{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.ps1"],
  "commandToExecute": "powershell.exe script1.ps1",
  "managedIdentity" : {}
}

Aby użyć tożsamości przypisanej przez użytkownika na docelowej maszynie wirtualnej lub zestawie skalowania maszyn wirtualnych, skonfiguruj managedidentity identyfikator klienta lub identyfikator obiektu tożsamości zarządzanej.

{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.ps1"],
  "commandToExecute": "powershell.exe script1.ps1",
  "managedIdentity" : { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" }
}
{
  "fileUris": ["https://mystorage.blob.core.windows.net/privatecontainer/script1.ps1"],
  "commandToExecute": "powershell.exe script1.ps1",
  "managedIdentity" : { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" }
}

Uwaga

Właściwość managedIdentitynie może być używana w połączeniu z właściwością storageAccountName or storageAccountKey .

Wdrażanie na podstawie szablonu

Rozszerzenia maszyn wirtualnych platformy Azure można wdrożyć przy użyciu szablonów usługi Azure Resource Manager. Schemat JSON opisany w poprzedniej sekcji może służyć w szablonie usługi Azure Resource Manager do uruchamiania rozszerzenia niestandardowego skryptu podczas wdrażania szablonu. W poniższych przykładach pokazano, jak używać rozszerzenia niestandardowego skryptu:

Wdrażanie przy użyciu programu PowerShell

Możesz użyć Set-AzVMCustomScriptExtension polecenia , aby dodać rozszerzenie niestandardowego skryptu do istniejącej maszyny wirtualnej. Aby uzyskać więcej informacji, zobacz Set-AzVMCustomScriptExtension.

Set-AzVMCustomScriptExtension -ResourceGroupName <resourceGroupName> `
    -VMName <vmName> `
    -Location myLocation `
    -FileUri <fileUrl> `
    -Run 'myScript.ps1' `
    -Name DemoScriptExtension

Przykłady

Używanie wielu skryptów

W tym przykładzie użyto trzech skryptów do skompilowania serwera. Właściwość commandToExecute wywołuje pierwszy skrypt. Następnie masz opcje, jak są wywoływane inne. Na przykład możesz mieć skrypt potencjalnego klienta, który kontroluje wykonywanie, z odpowiednią obsługą błędów, rejestrowaniem i zarządzaniem stanem. Skrypty są pobierane na komputer lokalny do uruchomienia.

Na przykład w pliku 1_Add_Tools.ps1 wywołasz polecenie 2_Add_Features.ps1 , dodając .\2_Add_Features.ps1 do skryptu. Powtórz ten proces dla innych skryptów zdefiniowanych w pliku $settings.

$fileUri = @("https://xxxxxxx.blob.core.windows.net/buildServer1/1_Add_Tools.ps1",
"https://xxxxxxx.blob.core.windows.net/buildServer1/2_Add_Features.ps1",
"https://xxxxxxx.blob.core.windows.net/buildServer1/3_CompleteInstall.ps1")

$settings = @{"fileUris" = $fileUri};

$storageAcctName = "xxxxxxx"
$storageKey = "1234ABCD"
$protectedSettings = @{"storageAccountName" = $storageAcctName; "storageAccountKey" = $storageKey; "commandToExecute" = "powershell -ExecutionPolicy Unrestricted -File 1_Add_Tools.ps1"};

#run command
Set-AzVMExtension -ResourceGroupName <resourceGroupName> `
    -Location <locationName> `
    -VMName <vmName> `
    -Name "buildserver1" `
    -Publisher "Microsoft.Compute" `
    -ExtensionType "CustomScriptExtension" `
    -TypeHandlerVersion "1.10" `
    -Settings $settings `
    -ProtectedSettings $protectedSettings;

Uruchamianie skryptów z udziału lokalnego

W tym przykładzie możesz chcieć użyć lokalnego serwera bloku komunikatów (SMB) dla lokalizacji skryptu. Następnie nie trzeba podawać żadnych innych ustawień, z wyjątkiem commandToExecute.

$protectedSettings = @{"commandToExecute" = "powershell -ExecutionPolicy Unrestricted -File \\filesvr\build\serverUpdate1.ps1"};

Set-AzVMExtension -ResourceGroupName <resourceGroupName> `
    -Location <locationName> `
    -VMName <vmName> `
    -Name "serverUpdate"
    -Publisher "Microsoft.Compute" `
    -ExtensionType "CustomScriptExtension" `
    -TypeHandlerVersion "1.10" `
    -ProtectedSettings $protectedSettings

Uruchamianie niestandardowego skryptu więcej niż raz przy użyciu interfejsu wiersza polecenia

Procedura obsługi rozszerzenia niestandardowego skryptu uniemożliwia ponowne uruchomienie skryptu, jeśli zostały przekazane dokładnie te same ustawienia. To zachowanie zapobiega przypadkowemu ponownemu uruchamianiu, co może powodować nieoczekiwane zachowania, jeśli skrypt nie jest idempotentny. Aby potwierdzić, czy program obsługi zablokował ponowne uruchomienie, spójrz na C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension\<HandlerVersion>\CustomScriptHandler.log*. Wyszukaj ostrzeżenie podobne do następującego:

Current sequence number, <SequenceNumber>, is not greater than the sequence number
of the most recently executed configuration. Exiting...

Jeśli chcesz uruchomić rozszerzenie niestandardowego skryptu więcej niż raz, możesz to zrobić tylko w następujących warunkach:

  • Parametr rozszerzenia Name jest taki sam jak poprzednie wdrożenie rozszerzenia.
  • Zaktualizowano konfigurację. Do polecenia można dodać właściwość dynamiczną, taką jak sygnatura czasowa. Jeśli program obsługi wykryje zmianę w ustawieniach konfiguracji, uważa, że zmiana jako jawne pragnienie ponownego uruchomienia skryptu.

Alternatywnie można ustawić właściwość ForceUpdateTag na truewartość .

Korzystanie z wywołania WebRequest

Jeśli używasz polecenia Invoke-WebRequest w skryscie, musisz określić parametr -UseBasicParsing. Jeśli nie określisz parametru, podczas sprawdzania szczegółowego stanu zostanie wyświetlony następujący błąd:

The response content cannot be parsed because the Internet Explorer engine
is not available, or Internet Explorer's first-launch configuration
is not complete. Specify the UseBasicParsing parameter and try again.

Virtual Machine Scale Sets

Jeśli wdrożysz rozszerzenie niestandardowego skryptu z witryny Azure Portal, nie masz kontroli nad wygaśnięciem tokenu SAS na potrzeby uzyskiwania dostępu do skryptu na koncie magazynu. Początkowe wdrożenie działa, ale gdy token SAS konta magazynu wygaśnie, każda kolejna operacja skalowania kończy się niepowodzeniem, ponieważ rozszerzenie niestandardowego skryptu nie może już uzyskać dostępu do konta magazynu.

Zalecamy użycie programu PowerShell, interfejsu wiersza polecenia platformy Azure lub szablonu usługi Azure Resource Manager podczas wdrażania rozszerzenia niestandardowego skryptu w zestawie skalowania maszyn wirtualnych. W ten sposób możesz użyć tożsamości zarządzanej lub mieć bezpośrednią kontrolę nad wygaśnięciem tokenu SAS na potrzeby uzyskiwania dostępu do skryptu na koncie magazynu tak długo, jak to konieczne.

Rozwiązywanie problemów i pomoc techniczna

Dane dotyczące stanu wdrożeń rozszerzeń można pobrać z witryny Azure Portal i przy użyciu modułu Azure PowerShell. Aby wyświetlić stan wdrożenia rozszerzeń dla maszyny wirtualnej, uruchom następujące polecenie:

Get-AzVMExtension -ResourceGroupName <resourceGroupName> `
    -VMName <vmName> -Name myExtensionName

Dane wyjściowe rozszerzenia są rejestrowane w plikach znajdujących się w następującym folderze na docelowej maszynie wirtualnej:

C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension

Określone pliki są pobierane do następującego folderu na docelowej maszynie wirtualnej:

C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.*\Downloads\<n>

W poprzedniej ścieżce jest liczbą całkowitą dziesiętną, <n> która może ulec zmianie między wykonaniami rozszerzenia. Wartość jest zgodna 1.* z rzeczywistą, bieżącą typeHandlerVersion wartością rozszerzenia. Na przykład rzeczywisty katalog może mieć wartość C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.8\Downloads\2.

Po uruchomieniu commandToExecute polecenia rozszerzenie ustawia ten katalog, na przykład ...\Downloads\2, jako bieżący katalog roboczy. Ten proces umożliwia używanie ścieżek względnych do lokalizowania plików pobranych przy użyciu fileURIs właściwości . Oto przykłady pobranych plików:

Identyfikator URI w fileUris Względna lokalizacja pobierania Bezwzględna lokalizacja pobierania
https://someAcct.blob.core.windows.net/aContainer/scripts/myscript.ps1 ./scripts/myscript.ps1 C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.8\Downloads\2\scripts\myscript.ps1
https://someAcct.blob.core.windows.net/aContainer/topLevel.ps1 ./topLevel.ps1 C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.8\Downloads\2\topLevel.ps1

Ścieżki katalogów bezwzględnych zmieniają się w okresie istnienia maszyny wirtualnej, ale nie w ramach pojedynczego wykonania rozszerzenia niestandardowego skryptu.

Ponieważ bezwzględna ścieżka pobierania może się różnić w czasie, lepiej jest wybrać względne ścieżki skryptu/pliku w commandToExecute ciągu, jeśli to możliwe. Na przykład:

"commandToExecute": "powershell.exe . . . -File \"./scripts/myscript.ps1\""

Informacje o ścieżce po pierwszym segmencie identyfikatora URI są przechowywane dla plików pobranych przy użyciu fileUris listy właściwości. Jak pokazano w poprzedniej tabeli, pobrane pliki są mapowane do podkatalogów pobierania w celu odzwierciedlenia fileUris struktury wartości.

Pomoc techniczna

  • Jeśli potrzebujesz pomocy dotyczącej jakiejkolwiek części tego artykułu, skontaktuj się z ekspertami platformy Azure w pomocy technicznej społeczności platformy Azure.

  • Aby zgłosić zdarzenie pomoc techniczna platformy Azure, przejdź do witryny pomoc techniczna platformy Azure i wybierz pozycję Uzyskaj pomoc techniczną.

  • Aby uzyskać informacje na temat korzystania z pomoc techniczna platformy Azure, zapoznaj się z często zadawanymi pytaniami dotyczącymi usługi Microsoft pomoc techniczna platformy Azure.