⁧⁩ملحق البرنامج النصي المخصص لـ Windows⁦⁩

يقوم ملحق البرنامج النصي المخصص بتنزيل البرامج النصية وتشغيلها على أجهزة Azure الظاهرية (VMs). استخدم هذا الملحق لتكوين ما بعد التوزيع أو تثبيت البرامج أو أي مهمة تكوين أو إدارة أخرى. يمكنك تنزيل البرامج النصية من Azure Storage أو GitHub، أو توفيرها إلى مدخل Microsoft Azure في وقت تشغيل إضافي.

يتكامل ملحق البرنامج النصي المخصص مع قوالب Azure Resource Manager. يمكنك أيضا تشغيله باستخدام Azure CLI أو Azure PowerShell أو مدخل Azure أو واجهة برمجة تطبيقات REST للأجهزة الظاهرية Azure.

توضح هذه المقالة كيفية استخدام ملحق البرنامج النصي المخصص باستخدام الوحدة النمطية Azure PowerShell وقوالب Azure Resource Manager. كما يوفر خطوات استكشاف الأخطاء وإصلاحها لأنظمة Windows.

المتطلبات الأساسية

إشعار

لا تستخدم ملحق البرنامج النصي المخصص للتشغيل Update-AzVM بنفس الجهاز الظاهري مثل المعلمة الخاصة به. سينتظر الملحق نفسه.

أنظمة تشغيل Windows المدعومة

Windows OS x64
Windows 10 مدعوم
Windows 11 مدعوم
Windows Server 2008 SP2 مدعوم
Windows Server 2008 R2 مدعوم
Windows Server 2012 مدعوم
Windows Server 2012 R2 مدعوم
Windows Server 2016‏ مدعوم
Windows Server 2016 Core مدعوم
Windows Server 2019 مدعوم
Windows Server 2019 Core مدعوم
Windows Server 2022 مدعوم
Windows Server 2022 Core مدعوم

موقع البرنامج النصي

يمكنك تعيين الملحق لاستخدام بيانات اعتماد Azure Blob Storage بحيث يمكنه الوصول إلى Azure Blob Storage. يمكن أن يكون موقع البرنامج النصي في أي مكان، طالما يمكن توجيه الجهاز الظاهري إلى نقطة النهاية هذه، على سبيل المثال، GitHub أو خادم ملفات داخلي.

الاتصال بالإنترنت

لتنزيل برنامج نصي خارجيا، مثل من GitHub أو Azure Storage، تحتاج إلى فتح منافذ جدار حماية أو مجموعة أمان شبكة (NSG) أخرى. على سبيل المثال، إذا كان برنامجك النصي موجوداً في Azure Storage، فيمكنك السماح بالوصول باستخدام علامات خدمة Azure NSG للتخزين.

لا يحتوي ملحق البرنامج النصي المخصص على أي طريقة لتجاوز التحقق من صحة الشهادة. إذا كنت تقوم بالتنزيل من موقع آمن باستخدام شهادة موقعة ذاتيا، على سبيل المثال، فقد تحصل على أخطاء مثل الشهادة البعيدة غير صالحة وفقا لإجراء التحقق من الصحة. تأكد من تثبيت الشهادة بشكل صحيح في مخزن المراجع المصدقة الجذر الموثوق بها على الجهاز الظاهري.

إذا كان البرنامج النصي الخاص بك على خادم محلي، فقد لا تزال بحاجة إلى فتح جدار حماية آخر أو منافذ NSG.

تلميحات

  • تقتصر المخرجات على آخر 4,096 بايت.
  • سيساعد الإلغاء الصحيح للأحرف على ضمان تحليل السلاسل بشكل صحيح. على سبيل المثال، تحتاج دائما إلى خطين مائلين عكسيين للهروب من خط مائل عكسي حرفي واحد عند التعامل مع مسارات الملفات. العينة: {"commandToExecute": "C:\\Windows\\System32\\systeminfo.exe >> D:\\test.txt"}
  • يرجع أعلى معدل فشل لهذا الملحق إلى أخطاء بناء الجملة في البرنامج النصي. تحقق من تشغيل البرنامج النصي دون أخطاء. ضع المزيد من تسجيل الدخول إلى البرنامج النصي لتسهيل العثور على حالات الفشل.
  • كتابة البرامج النصية غير المتكررة، بحيث لا يؤدي تشغيلها أكثر من مرة عن طريق الخطأ إلى تغييرات في النظام.
  • تأكد من أن البرامج النصية لا تتطلب إدخال المستخدم عند تشغيلها.
  • يُسمح للبرنامج النصي بـ 90 دقيقة للتشغيل. أي شيء أطول يؤدي إلى فشل توفير الملحق.
  • لا تضع عمليات إعادة التشغيل داخل البرنامج النصي. يتسبب هذا الإجراء في حدوث مشاكل مع الملحقات الأخرى التي يتم تثبيتها، ولا يستمر الملحق بعد إعادة التشغيل.
  • إذا كان لديك برنامج نصي يؤدي إلى إعادة التشغيل قبل تثبيت التطبيقات وتشغيل البرامج النصية، فقم بجدولة إعادة التشغيل باستخدام مهمة مجدولة في Windows أو باستخدام أدوات مثل ملحقات DSC أو Chef أو Puppet.
  • لا تقم بتشغيل برنامج نصي يتسبب في إيقاف عامل الجهاز الظاهري أو تحديثه. قد يترك الملحق في حالة انتقال ويؤدي إلى انتهاء المهلة.
  • يقوم الملحق بتشغيل برنامج نصي مرة واحدة فقط. إذا كنت تريد تشغيل برنامج نصي على كل بدء تشغيل، فاستخدم الملحق لإنشاء Windows Scheduled Task.
  • إذا كنت تريد جدولة وقت تشغيل برنامج نصي، فاستخدم الملحق لإنشاء مهمة مجدولة في Windows.
  • عند تشغيل البرنامج النصي، لا ترى سوى حالة ملحق انتقال من مدخل Microsoft Azure أو Azure CLI. إذا كنت تريد تحديثات حالة أكثر تكرارا لبرنامج نصي قيد التشغيل، فقم بإنشاء الحل الخاص بك.
  • لا يدعم ملحق البرنامج النصي المخصص أصلاً الخوادم الوكيلة. ومع ذلك، يمكنك استخدام أداة نقل الملفات، مثل Invoke-WebRequest، التي تدعم خوادم الوكيل داخل البرنامج النصي الخاص بك.
  • كن على علم بمواقع الدليل غير الافتراضية التي قد تعتمد عليها البرامج النصية أو الأوامر. لديك منطق للتعامل مع هذا الموقف.
  • يتم تشغيل ملحق البرنامج النصي المخصص ضمن LocalSystem الحساب.
  • إذا كنت تخطط لاستخدام storageAccountName و storageAccountKey الخصائص، فيجب أن تكون هذه الخصائص متطابقة في protectedSettings.
  • يمكنك تطبيق إصدار واحد فقط من الملحق على الجهاز الظاهري. لتشغيل برنامج نصي مخصص ثان، يمكنك تحديث الملحق الحالي بتكوين جديد. بدلا من ذلك، يمكنك إزالة ملحق البرنامج النصي المخصص وإعادة تطبيقه باستخدام البرنامج النصي المحدث

مخطط الملحق

يحدد تكوين ملحق البرنامج النصي المخصص أشياء مثل موقع البرنامج النصي والأمر المراد تشغيله. يمكنك تخزين هذا التكوين في ملفات التكوين، أو تحديده في سطر الأوامر، أو تحديده في قالب Azure Resource Manager.

يمكنك تخزين البيانات الحساسة في تكوين محمي، والذي يتم تشفيره وفك تشفيره فقط داخل الجهاز الظاهري. يكون التكوين المحمي مفيدًا عندما يتضمن أمر التنفيذ أسرارًا مثل كلمة مرور أو مرجع ملف توقيع وصول مشترك (SAS). إليك مثال:

{
    "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"
            ]
        }
    }
}

إشعار

الخاصية managedIdentity لا يجب أن تُستخدم بالاقتران مع الخاصية storageAccountName أو storageAccountKey.

يمكن تثبيت إصدار واحد فقط من الملحق على جهاز ظاهري في كل مرة. يفشل تحديد برنامج نصي مخصص مرتين في نفس قالب Azure Resource Manager لنفس الجهاز الظاهري.

يمكنك استخدام هذا المخطط داخل مورد الجهاز الظاهري أو كمورد مستقل. إذا تم استخدام هذا الملحق كمورد مستقل في قالب Azure Resource Manager، يجب أن يكون اسم المورد بتنسيق virtualMachineName/extensionName.

قيم Property

الاسم قيمة أو مثال نوع البيانات
apiVersion 2015-06-15 date
publisher Microsoft.Compute سلسلة
النوع CustomScriptExtension سلسلة
typeHandlerVersion 1.10 العدد الصحيح
fileUris https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/scripts/configure-music-app.ps1 صفيف
الطابع الزمني 123456789 عدد صحيح بحجم 32 بت
commandToExecute powershell -ExecutionPolicy Unrestricted -File configure-music-app.ps1 سلسلة
storageAccountName examplestorageacct سلسلة
storageAccountKey TmJK/1N3AbAZ3q/+hOXoi/l73zOqsaxXDhqa9Y83/v5UpXQp2DQIBuv2Tifp60cE/OaHsJZmQZ7teQfczQj8hg== سلسلة
الهوية المُدارة { } أو { "clientId": "31b403aa-c364-4240-a7ff-d85fb6cd7232" } أو { "objectId": "12dd289c-0583-46e5-b9b4-115d5c19ef4b" } كائن JSON

إشعار

أسماء خصائص JSON حساسة في حالة الأحرف. لتجنب مشاكل النشر، استخدم الأسماء كما هو موضح هنا.

تفاصيل قيمة الخاصية

الخاصية اختياري أم مطلوب التفاصيل
fileUris اختياري عناوين URL للملفات المراد تنزيلها. إذا كانت عناوين URL حساسة، على سبيل المثال، إذا كانت تحتوي على مفاتيح، فيجب تحديد هذا الحقل في protectedSettings.
commandToExecute المطلوب البرنامج النصي لنقطة الإدخال المراد تشغيله. استخدم هذه الخاصية إذا كان الأمر يحتوي على أسرار مثل كلمات المرور أو إذا كانت عناوين URI للملفات حساسة.
الطابع الزمني اختياري باشر بتغيير هذه القيمة فقط لتشغيل إعادة تشغيل البرنامج النصي. أي قيمة صحيحة مقبولة، طالما أنها تختلف عن القيمة السابقة.
storageAccountName اختياري اسم حساب التخزين خاصتك. إذا حددت بيانات اعتماد التخزين، فيجب أن تكون جميع القيم fileUris عناوين URL لكائنات Azure الثنائية كبيرة الحجم.
storageAccountKey اختياري مفتاح الوصول لحساب التخزين.
الهوية المُدارة اختياري الهوية المدارة لتنزيل الملفات. القيم الصالحة هي clientId (اختياري، سلسلة)، وهو معرف العميل للهوية المدارة، و objectId (اختياري، سلسلة)، وهو معرف الكائن للهوية المدارة.

يتم إرسال الإعدادات العامة في نص واضح إلى الجهاز الظاهري حيث يتم تشغيل البرنامج النصي. يتم تشفير الإعدادات المحمية من خلال مفتاح معروف فقط ل Azure والجهاز الظاهري. تُحفظ الإعدادات على الجهاز الظاهري كما تم إرسالها. بمعنى أنه في حالة تشفير الإعدادات، ستُحفظ مشفرةً على الجهاز الظاهري. يتم تخزين الشهادة المستخدمة لفك تشفير القيم المشفرة على الجهاز الظاهري. يتم استخدام الشهادة أيضا لفك تشفير الإعدادات، إذا لزم الأمر، في وقت التشغيل.

قد يكون استخدام الإعدادات العامة مفيدًا لتصحيح الأخطاء، ولكننا نوصي باستخدام الإعدادات المحمية.

يمكنك تعيين القيم التالية إما في الإعدادات العامة أو المحمية. يرفض الملحق أي تكوين حيث يتم تعيين هذه القيم في كل من الإعدادات العامة والمحمية.

  • commandToExecute
  • fileUris

العقار: managedIdentity

إشعار

هذه الخاصية يجب أن تُحدَّد في الإعدادات المحمية فقط.

يدعم ملحق البرنامج النصي المخصص، الإصدار 1.10 والإصدارات الأحدث، الهويات المدارة لتنزيل الملفات من عناوين URL المتوفرة fileUris في الإعداد. تسمح الخاصية لملحق البرنامج النصي المخصص بالوصول إلى الكائنات الثنائية كبيرة الحجم أو الحاويات الخاصة ل Azure Storage دون أن يضطر المستخدم إلى تمرير أسرار مثل رموز SAS المميزة أو مفاتيح حساب التخزين.

لاستخدام هذه الميزة، أضف هوية معينة من قبل النظام أو معينة من قبل المستخدم إلى الجهاز الظاهري أو مجموعة مقياس الجهاز الظاهري حيث يتم تشغيل ملحق البرنامج النصي المخصص. ثم امنح الوصول إلى الهوية المدارة إلى حاوية تخزين Azure أو الكائن الثنائي كبير الحجم.

لاستخدام الهوية المعينة من قبل النظام على الجهاز الظاهري الهدف أو مجموعة مقياس الجهاز الظاهري، قم بتعيين managedidentity إلى كائن JSON فارغ.

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

لاستخدام الهوية المعينة من قبل المستخدم على الجهاز الظاهري الهدف أو مجموعة مقياس الجهاز الظاهري، قم بالتكوين managedidentity باستخدام معرف العميل أو معرف الكائن للهوية المدارة.

{
  "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" }
}

إشعار

الخاصية managedIdentity لا يجب أن تُستخدم بالاقتران مع الخاصية storageAccountName أو storageAccountKey.

توزيع قالب

يمكنك توزيع ملحقات جهاز Azure الظاهري باستخدام قوالب Azure Resource Manager. يمكن استخدام مخطط JSON المفصل في القسم السابق في قالب Azure Resource Manager لتشغيل ملحق البرنامج النصي المخصص أثناء توزيع القالب. توضح النماذج التالية كيفية استخدام ملحق البرنامج النصي المخصص:

توزيع PowerShell

يمكنك استخدام Set-AzVMCustomScriptExtension الأمر لإضافة ملحق البرنامج النصي المخصص إلى جهاز ظاهري موجود. لمزيد من المعلومات، راجع Set-AzVMCustomScriptExtension.

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

الأمثلة

استخدام برامج نصية متعددة

يستخدم هذا المثال ثلاثة برامج نصية لإنشاء الخادم الخاص بك. تستدعي commandToExecute الخاصية البرنامج النصي الأول. لديك بعد ذلك خيارات حول كيفية استدعاء الآخرين. على سبيل المثال، يمكن أن يكون لديك برنامج نصي عميل متوقع يتحكم في التنفيذ، مع معالجة الأخطاء الصحيحة وتسجيل الدخول وإدارة الحالة. يتم تنزيل البرامج النصية إلى الجهاز المحلي لتشغيلها.

على سبيل المثال، في 1_Add_Tools.ps1، يمكنك استدعاء 2_Add_Features.ps1 عن طريق الإضافة .\2_Add_Features.ps1 إلى البرنامج النصي. كرر هذه العملية مع البرامج النصية الأخرى التي تحددها في $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;

تشغيل البرامج النصية من مشاركة محلية

في هذا المثال، قد ترغب في استخدام خادم Server Message Block (SMB) محلي لموقع البرنامج النصي الخاص بك. لا تحتاج بعد ذلك إلى توفير أي إعدادات أخرى، باستثناء 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

تشغيل برنامج نصي مخصص أكثر من مرة باستخدام CLI

يمنع معالج ملحق البرنامج النصي المخصص إعادة تشغيل برنامج نصي إذا تم تمرير نفس الإعدادات بالضبط . يمنع هذا السلوك إعادة التشغيل العرضي، مما قد يتسبب في سلوكيات غير متوقعة إذا لم يكن البرنامج النصي idempotent. لتأكيد ما إذا كان المعالج قد حظر إعادة التشغيل، انظر إلى C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension\<HandlerVersion>\CustomScriptHandler.log*. البحث عن تحذير مثل هذا:

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

إذا كنت ترغب في تشغيل ملحق البرنامج النصي المخصص أكثر من مرة، يمكنك القيام بذلك فقط في ظل هذه الشروط:

  • معلمة الإضافة Name هي نفسها النشر السابق للإضافة.
  • لقد قمت بتحديث التكوين. يمكنك إضافة خاصية ديناميكية إلى الأمر، مثل طابع زمني. إذا اكتشف المعالج تغييرا في إعدادات التكوين، فإنه يعتبر هذا التغيير رغبة صريحة في إعادة تشغيل البرنامج النصي.

بدلًا من ذلك، يمكنك تعيين الخاصية ForceUpdateTag إلى true.

استخدام Invoke-WebRequest

إذا كنت تستخدم Invoke-WebRequest في البرنامج النصي، فيجب عليك تحديد المعلمة -UseBasicParsing. إذا لم تحدد المعلمة، فستحصل على الخطأ التالي عند التحقق من الحالة التفصيلية:

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.

مجموعات توسيع الجهاز الظاهري

إذا وزعت ملحق البرنامج النصي المخصص من مدخل Azure، فلن يكون لديك التحكم في انتهاء صلاحية رمز SAS المميز للوصول إلى البرنامج النصي في حساب التخزين لديك. يعمل التوزيع الأولي، ولكن عند انتهاء صلاحية رمز SAS المميز لحساب التخزين، تفشل أي عملية تحجيم لاحقة لأن ملحق البرنامج النصي المخصص لم يعد قادرا على الوصول إلى حساب التخزين.

نوصي باستخدام PowerShell أو Azure CLI أو قالب Azure Resource Manager عند نشر ملحق البرنامج النصي المخصص على مجموعة مقياس الجهاز الظاهري. وبهذه الطريقة، يمكنك اختيار استخدام هوية مدارة أو التحكم المباشر في انتهاء صلاحية الرمز المميز SAS للوصول إلى البرنامج النصي في حساب التخزين الخاص بك طالما احتجت إلى ذلك.

استكشاف الأخطاء وإصلاحها والدعم

يمكن استرداد البيانات حول حالة عمليات توزيع الملحقات من مدخل Microsoft Azure وباستخدام وحدة Azure PowerShell النمطية. للاطلاع على حالة توزيع ملحقات جهاز ظاهري معين، قم بتشغيل الأمر التالي:

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

يتم تسجيل إخراج الملحق إلى الملفات الموجودة ضمن المجلد التالي على الجهاز الظاهري الهدف:

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

يتم تنزيل الملفات المحددة في المجلد التالي على الجهاز الظاهري الهدف:

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

في المسار السابق، <n> هو عدد صحيح عشري قد يتغير بين عمليات تنفيذ الامتداد. تتطابق 1.* القيمة مع القيمة الفعلية الحالية typeHandlerVersion للإضافة. على سبيل المثال، قد يكون الدليل الفعلي C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.8\Downloads\2.

عند تشغيل commandToExecute الأمر، يعين الملحق هذا الدليل، على سبيل المثال، ...\Downloads\2، كدليل العمل الحالي. تتيح هذه العملية استخدام المسارات النسبية لتحديد موقع الملفات التي تم تنزيلها باستخدام الخاصية fileURIs . فيما يلي أمثلة على الملفات التي تم تنزيلها:

URI في fileUris موقع التنزيل النسبي موقع التنزيل المطلق
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

تتغير مسارات الدليل المطلقة على مدى عمر الجهاز الظاهري، ولكن ليس ضمن تنفيذ واحد من ملحق البرنامج النصي المخصص.

نظرًا لأن مسار التنزيل المطلق قد يختلف بمرور الوقت، فمن الأفضل اختيار مسارات البرنامج النصي/الملف النسبية في commandToExecute السلسلة، كلما أمكن ذلك. على سبيل المثال:

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

يتم الاحتفاظ بمعلومات المسار بعد مقطع URI الأول للملفات التي تم تنزيلها باستخدام قائمة الخصائص fileUris . كما هو موضح في الجدول السابق، يتم تعيين الملفات التي تم تنزيلها في الدلائل الفرعية للتنزيل لتعكس بنية القيم fileUris.

يدعم