
أداة تسجيل الأجهزة المارقة لـ Entra ID و Intune MDM. تقوم بأتمتة انضمام الجهاز، الحصول على الرمز، التسجيل في MDM، والتحقق من OMA-DM لاستخراج السياسات، بيانات اعتماد Wi-Fi، البرامج النصية، والتطبيقات مع تجاوز الوصول المشروط.
مستوحى من أداة Pytune الأصلية، يقوم OutOfTune بتسجيل جهاز مارق في Entra ID، وتسجيله في Intune MDM، والتحقق من حالة الامتثال الناتجة.
يدعم فقط أجهزة Windows حيث كان هذا هدفي الرئيسي، وقد أضيف أجهزة إضافية في المستقبل.
المدونة المصاحبة:
pip install -r requirements.txt
تسلسل العمليات يعمل على مراحل، كل مرحلة تبني على الحالة المحفوظة في chain_state.json.
drs-token -> device-join -> device-token -> mdm-enroll -> mdm-checkin
ROPC (بيانات الاعتماد معروفة):
python OutOfTune.py drs-token -u [email protected] -p Password1!
رمز تم الحصول عليه مسبقًا:
python OutOfTune.py drs-token -u [email protected] -t <drs_access_token>
python OutOfTune.py device-join
python OutOfTune.py device-join -n CORP-LAPTOP-01
يُخرج <DEVICENAME>.pfx - شهادة الجهاز. كلمة المرور هي password.
python OutOfTune.py device-token
python OutOfTune.py device-token --cert CORP-LAPTOP-01.pfx
يُصادق إلى AAD كهوية الجهاز (وليس كمستخدم). يتجاوز سياسات CA المخصصة للمستخدمين.
python OutOfTune.py mdm-enroll
python OutOfTune.py mdm-enroll --profile profiles/dell_win11_ent.json
يقوم بتشغيل اكتشاف SOAP على نقطة نهاية MDM، ثم يرسل طلب تسجيل WS-Trust PKCS10. يُخرج <DEVICENAME>_mdm.pfx.
استخدم --profile لتزوير سمات الأجهزة/نظام التشغيل المرسلة إلى Intune (انظر ملفات تعريف الأجهزة).
python OutOfTune.py mdm-checkin
python OutOfTune.py mdm-checkin -r <refresh_token>
python OutOfTune.py mdm-checkin --cert CORP-LAPTOP-01_mdm.pfx
python OutOfTune.py mdm-checkin -O ./output
python OutOfTune.py mdm-checkin -O ./output --save-syncml ./output/raw
يقوم بتشغيل حلقة OMA-DM SyncML مقابل r.manage.microsoft.com. سيدفع Intune ملفات تعريف التكوين وتعيينات التطبيقات وأي سياسات أخرى تستهدف الجهاز. بعد اكتمال الحلقة، يتم استخراج المعلومات تلقائيًا وعرضها.
إذا تم توفير -r، يتم استبدال رمز التحديث برمز وصول لـ manage.microsoft.com ويُرسل كـ Authorization: Bearer في كل طلب SyncML. يقرأ Intune UPN من هذا الرمز ويضبطه كمستخدم أساسي للجهاز، مما يؤدي إلى ربط سياسات الامتثال المخصصة للمستخدم. تحتاج فقط إلى تشغيله مرة واحدة مع -r لتعيين مستخدم، ويمكن تشغيل جميع عمليات تسجيل الدخول اللاحقة بدون رمز تحديث.
بدون -r، لن يكون للجهاز مستخدم أساسي.
بعد هذا التسجيل الأولي، إذا لم تقم بتسجيل الدخول مرة أخرى لفترة ممتدة (عادة 5-7 أيام)، فقد يصبح الجهاز غير متوافق بسبب السياسة الافتراضية لـ "Is Active". اعتمادًا على تكوين Intune، قد يدخل الجهاز في فترة سماح قبل وضع علامة عليه كغير متوافق. إذا حدث هذا، أعد تشغيل mdm-checkin. إذا كنت قد استخدمت سابقًا رمز تحديث لتعيين مستخدم أساسي، فلا داعي لإرساله مرة أخرى حيث يتم تخزين المستخدم الأساسي الآن في خلفية Intune.
إعادة تحليل جولات XML الخام المحفوظة باستخدام --save-syncml دون تشغيل تسجيل دخول حي.
python OutOfTune.py parse-checkin --dir ./output/raw -O ./output2
python OutOfTune.py parse-checkin --file ./output/raw/round_001.xml -O ./output2
python OutOfTune.py check -u [email protected] -r <refresh_token>
python OutOfTune.py check -u [email protected] -p Password1!
يقوم بإصدار PRT من شهادة الجهاز، ويستبدله برمز IWService، ويستعلم IWService/Devices عن حالة امتثال الجهاز وأي قواعد غير متوافقة.
استخدم -r مع رمز تحديث جلسة MFA إذا كانت سياسة CA الخاصة بالمستأجر تتطلب MFA لمورد التسجيل.
يجلب تطبيقات Win32 والبرامج النصية PowerShell المخصصة للجهاز عبر IME SideCarGateway. يستخدم شهادة عميل MDM فقط — لا حاجة لرمز مستخدم.
python OutOfTune.py download-apps
python OutOfTune.py download-apps --cert CORP-LAPTOP-01_mdm.pfx
scripts/<PolicyId>.ps1apps/<AppName>/يجلب البرامج النصية للتصحيح الاستباقي (أزواج الكشف + التصحيح) المخصصة للجهاز.
python OutOfTune.py get-remediations
python OutOfTune.py get-remediations --cert CORP-LAPTOP-01_mdm.pfx
يتم حفظ كل سياسة في remediations/<PolicyId>/ تحتوي على:
detection.ps1 — برنامج الكشف النصيremediation.ps1 — برنامج التصحيح النصيparams.json — معرف السياسة وأي معامِلات نصيةإذا فشل إزالة الجهاز من Intune، احذفه من Entra. ثم سيدخل في فترة سماح داخل Intune وسيُعاد إدارته تلقائيًا في وقت لاحق.
إزالة الجهاز من Intune:
python OutOfTune.py retire-intune -u [email protected] -r <refresh_token>
حذف كائن الجهاز من Entra ID:
python OutOfTune.py entra-delete
python OutOfTune.py status
سمات الجهاز المرسلة إلى Intune أثناء التسجيل وتسجيل الدخول قابلة للتزوير بالكامل عبر ملف تعريف JSON. يشمل ذلك معرفات الأجهزة، إصدار نظام التشغيل، الشركة المصنعة، وجميع قيم امتثال CSP المُبلغ عنها ذاتيًا (BitLocker، جدار الحماية، Defender، TPM، الإقلاع الآمن).
python OutOfTune.py mdm-enroll --profile profiles/dell_win11_ent.json
python OutOfTune.py mdm-checkin # يتم حفظ ملف التعريف في الحالة وإعادة استخدامه تلقائيًا
| الملف | الجهاز |
|---|---|
profiles/default.json | القيم الافتراضية (VMware / Win10 Enterprise) |
profiles/dell_win11_ent.json | Dell Latitude 5540 / Windows 11 Enterprise 23H2 |
جميع قيم DeviceStatus CSP هي مُبلغ عنها ذاتيًا ويتم الوثوق بها من قبل Intune دون تحقق مستقل. تتطلب فحوصات الامتثال HAS-attested (BitLockerEnabled، SecureBootEnabled عبر HealthAttestation CSP) وجود TPM حقيقي ولا يمكن تزويرها بهذه الطريقة.
--debug تسجيل HTTP + الرموز المفصلة
--proxy <url> توجيه حركة المرور عبر وكيل (مثل http://127.0.0.1:8080)
توضع هذه العلامات قبل الأمر:
python OutOfTune.py --debug device-token
python OutOfTune.py --proxy http://127.0.0.1:8080 mdm-checkin
إذا كانت لديك شهادات من تشغيل سابق أو تريد استخدام ملفات PFX محددة:
python OutOfTune.py device-token --cert path/to/device.pfx
python OutOfTune.py mdm-enroll --cert path/to/device.pfx
python OutOfTune.py mdm-checkin --cert path/to/mdm.pfx
python OutOfTune.py check --cert path/to/device.pfx
python OutOfTune.py download-apps --cert path/to/mdm.pfx
python OutOfTune.py get-remediations --cert path/to/mdm.pfx
يتم حفظ جميع مخرجات المراحل في chain_state.json في دليل العمل. احذفه لبدء من جديد. استخدم status لفحص الحالة الحالية دون تشغيل أي شيء. إذا كنت تتعامل مع أجهزة متعددة، فتأكد من أن لكل جهاز ملف حالة خاص به. يمكن تغيير ملف الحالة الافتراضي في بداية البرنامج النصي للجهاز الذي تتعامل معه. كن حذرًا مع خيارات تجاوز الشهادات، فهي مخصصة أساسًا لأغراض التصحيح.
يعود الفضل الكبير إلى @temp43487580 الذي أنشأ Pytune الأصلية والذي جعل بحثه الأصلي هذا ممكنًا
| العلامة | الوصف |
|---|
--cert FILE | ملف MDM PFX للاستخدام — يتم اشتقاق اسم الجهاز تلقائيًا من اسم الملف |
-r RT | رمز تحديث المستخدم — يعين المستخدم الأساسي (مطلوب مرة واحدة فقط) |
-O DIR | حفظ القطع الأثرية المستخرجة في DIR (wifi/، vpn/، scripts/، certs/، add_values.json، policy_values.json) |
--save-syncml DIR | حفظ ملفات SyncML الخام لكل جولة في DIR لإعادة التحليل دون اتصال |
-o FILE | كتابة كل مخرجات وحدة التحكم في FILE |
| الفئة | محفوظ في | ملاحظات |
|---|
| ملفات تعريف Wi-Fi | wifi/<SSID>.xml + _psk.txt | يتم استخراج PSK بنص واضح إذا كان موجودًا |
| ملفات تعريف VPN | vpn/<name>.xml | ProfileXML كامل |
| حمولات الشهادات | certs/cert_N.b64 | كتل PFX مشفرة (خام، لم يتم فك تشفيرها بعد) |
| تحديات SCEP | معروضة | اسم طراز CA، رابط التحدي |
| البرامج النصية | scripts/<name>.ps1 | نصوص PowerShell المُرسلة عبر OMA-DM |
| روابط تنزيل MSI | معروضة | روابط CDN مباشرة لتطبيقات LOB |
| كائن ODJ | odj_blob.b64 + odj_strings.txt | الانضمام إلى المجال دون اتصال — يتم استخراج السلاسل القابلة للقراءة |
| قيم الإضافة | add_values.json | جميع أوامر الإضافة الأخرى (شهادات Root CA، إعداد MDE، تكوين السياسة) |
| قيم الاستبدال | policy_values.json | قيم سياسة CSP التي يحددها Intune |
| الحقل | CSP | ملاحظات |
|---|
os_version | DevDetail/SwV | فحوصات الامتثال للحد الأدنى/الأقصى لإصدار نظام التشغيل |
os_edition_syncml | WindowsLicensing/Edition | 4 = Enterprise، 48 = Pro |
manufacturer | DevInfo/Man | بعض السياسات تُدرج الشركات المصنعة في القائمة البيضاء |
mac_address | SOAP AdditionalContext/MAC | جميع الأصفار مؤشر واضح |
hw_dev_id_enroll | SOAP AdditionalContext/HWDevID | 64 حرفًا سداسيًا عشريًا |
bitlocker_status | BitLocker/Status/DeviceEncryptionStatus | 2 = مشفر (مُبلغ عنه ذاتيًا) |
encryption_compliance | DeviceStatus/Compliance/EncryptionCompliance | 1 = متوافق (مُبلغ عنه ذاتيًا) |
firewall_status | DeviceStatus/Firewall/Status | 0 = نشط (مُبلغ عنه ذاتيًا) |
secure_boot_state | DeviceStatus/SecureBootState | 1 = مفعل (مُبلغ عنه ذاتيًا، ليس HAS-attested) |
tpm_version | DeviceStatus/TPM/SpecificationVersion | لا دليل تشفيري |
defender_enabled | Defender/Health/DefenderEnabled | true = قيد التشغيل |
defender_version | Defender/Health/DefenderVersion | بعض السياسات تفرض إصدارًا أدنى |