
أداة واجهة سطر أوامر لإدارة تفعيلات أدوار Azure Privileged Identity Management (PIM) مباشرة من طرفيتك.
أداة سطر أوامر لإدارة تفعيل أدوار Azure Privileged Identity Management (PIM) مباشرة من الطرفية الخاصة بك.
قبل استخدام azpim، تأكد من أن لديك:
# Install Azure CLI (if not installed)
# See: https://docs.microsoft.com/en-us/cli/azure/install-azure-cli
# Login to Azure
az login
# Verify you're logged in
az account show
# Using npm
npm install -g azpim
# Using pnpm
pnpm add -g azpim
# Using yarn
yarn global add azpim
بعد التثبيت، سيكون الأمر azpim متاحًا بشكل عام.
إذا كنت تستخدم سابقًا azp-cli، فسيتم تخزين الإعدادات المسبقة الخاصة بك في ~/.config/azp-cli/ (أو %APPDATA%\azp-cli\ على Windows). للترحيل:
presets.json إلى الموقع الجديد: ~/.config/azpim/ (أو %APPDATA%\azpim\)npm uninstall -g azp-cli# Clone the repository
git clone https://github.com/tapanmeena/azpim.git
cd azpim
# Install dependencies
pnpm install
# Build the project
pnpm build
# Link globally for development
npm link
# After global installation
azpim
# Or with specific commands
azpim activate
azpim deactivate
azpim preset list
azpim update
# Development mode (from source)
pnpm dev
العلامات العامة:
--debug - تمكين تسجيل التصحيح--version - إظهار رقم الإصداريمكنك التحقق من توفر إصدار أحدث:
azpim update
# alias
azpim upgrade
ملاحظات:
azpim update يخرج برمز 0 عندما يكون محدثًا، و2 عندما يتوفر تحديث، و1 عند حدوث خطأ.--check-only - فقط تحقق واطبع الحالة دون عرض تعليمات الترقية.--output json يعيد استجابة منظمة مناسبة للنصوص البرمجية.azpim activate و azpim deactivate تلميحًا قصيرًا عن "تحديث متاح" (وضع النص فقط) مرة واحدة على الأكثر يوميًا.AZPIM_NO_UPDATE_NOTIFIER=1 (أو AZPIM_DISABLE_UPDATE_CHECK=1).يتم تخزين ذاكرة فحص التحديث المؤقتة بجانب الإعدادات المسبقة في دليل الإعدادات الخاص بك:
~/.config/azpim/update-check.json (أو $XDG_CONFIG_HOME/azpim/update-check.json)%APPDATA%\azpim\update-check.jsonاستخدم العلامات لتفعيل أو إلغاء تنشيط أدوار PIM مباشرة دون المرور عبر القائمة التفاعلية، مثالي للنصوص البرمجية وسير عمل CI/CD.
# Activate a single role by name (non-interactive)
azpim activate --non-interactive --yes \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Owner" \
--duration-hours 2 \
--justification "Break-glass for incident" \
--output json
# Activate multiple roles (repeat --role-name)
azpim activate --non-interactive --yes \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Contributor" \
--role-name "User Access Administrator"
# If a role name matches multiple eligible roles (different scopes),
# --non-interactive will error unless you explicitly allow activating all matches
azpim activate --non-interactive --yes \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Contributor" \
--allow-multiple
# Preview what would happen without submitting requests
azpim activate --non-interactive --dry-run \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Contributor" \
--output json
# Deactivate specific roles
azpim deactivate --non-interactive --yes \
--subscription-id <SUBSCRIPTION_GUID> \
--role-name "Owner" \
--justification "Task completed"
# Deactivate across all subscriptions (omit subscription-id)
azpim deactivate --non-interactive --yes \
--role-name "Contributor" \
--allow-multiple
العلامات المشتركة (تفعيل/إلغاء تنشيط):
--non-interactive - تعطيل المطالبات التفاعلية-y, --yes - تخطي مطالبات التأكيد--subscription-id <id> - الاشتراك المستهدف (اختياري لإلغاء التنشيط)--role-name <name> - اسم (أسماء) الدور المستهدف (يمكن تكراره)--allow-multiple - السماح بتطابقات أدوار متعددة--dry-run - معاينة بدون إرسال--output <text|json> - تنسيق المخرجات (افتراضي: text)--quiet - إخفاء المخرجات غير الأساسيةخاصة بالتفعيل:
--duration-hours <n> - المدة (1-8 ساعات، المدة الافتراضية تختلف حسب الدور)--justification <text> - مبرر التفعيلخاصة بإلغاء التنشيط:
--justification <text> - مبرر إلغاء التنشيط (اختياري)تتيح لك الإعدادات المسبقة حفظ روتينات التفعيل/إلغاء التنشيط اليومية (الاشتراك + أسماء الأدوار + المدة + المبرر) وإعادة استخدامها باستخدام --preset <name>.
افتراضيًا، يتم تخزين الإعدادات المسبقة في ملف إعدادات لكل مستخدم:
~/.config/azpim/presets.json (أو $XDG_CONFIG_HOME/azpim/presets.json)%APPDATA%\azpim\presets.jsonتجاوز الموقع باستخدام:
AZPIM_PRESETS_PATH=/path/to/presets.jsonيمكن للإعداد المسبق تحديد كتلة واحدة أو كلتيهما:
activate: subscriptionId، roleNames[]، durationHours، justification، allowMultipledeactivate: subscriptionId (اختياري)، roleNames[]، justification، allowMultiplejustification يدعم القوالب البسيطة:
${date} → YYYY-MM-DD${datetime} → طابع زمني ISO${userPrincipalName} → يتم حله عبر Microsoft Graph /me# Create a preset (interactive wizard)
azpim preset add daily-ops
# Create a preset with Azure integration (fetches subscriptions/roles)
azpim preset add daily-ops --from-azure
# Edit a preset (interactive wizard)
azpim preset edit daily-ops
# List all presets
azpim preset list
# Show one preset details
azpim preset show daily-ops
# Remove a preset
azpim preset remove daily-ops
# Use a preset (flags still override preset values)
azpim activate --preset daily-ops --yes
# Non-interactive run using the preset
azpim activate --preset daily-ops --non-interactive --yes --output json
# Deactivate using a preset
azpim deactivate --preset daily-ops --non-interactive --yes
عند إنشاء إعداد مسبق عبر azpim preset add، يمكنك اختياريًا تعيينه كإعداد افتراضي للتفعيل activate و/أو إلغاء التنشيط deactivate.
azpim activate --non-interactive --yes العمل دون تحديد --subscription-id/--role-name.╔════════════════════════════════════════════════════╗
║ Azure PIM CLI - Role Activation Manager ║
╚════════════════════════════════════════════════════╝
✔ Authentication successful
┌─ User Information ──────────────────────────────────
│ Name: John Doe
│ Email: [email protected]
└──────────────────────────────────────────────────────
✔ Found 3 subscription(s)
? What would you like to do?
❯ ▶ Activate Role(s)
◼ Deactivate Role(s)
✕ Exit
تتيح لك المفضلة وضع علامة على اشتراكات معينة للوصول السريع. يتم عرض الاشتراكات المفضلة في أعلى قوائم الاشتراكات في القائمة التفاعلية.
افتراضيًا، يتم تخزين المفضلة لكل مستخدم:
~/.config/azpim/users/<userId>/favorites.json%APPDATA%\azpim\users\<userId>\favorites.jsonتجاوز الموقع باستخدام:
AZPIM_FAVORITES_PATH=/path/to/favorites.json# List all favorites
azpim favorites list
azpim fav list
# Add a subscription to favorites
azpim favorites add <subscription-id>
# Add even if subscription is not in cache
azpim favorites add <subscription-id> --force
# Remove a subscription from favorites
azpim favorites remove <subscription-id>
# Clear all favorites
azpim favorites clear
# Export favorites to a file
azpim favorites export ./my-favorites.json
# Import favorites from a file (replaces existing)
azpim favorites import ./my-favorites.json
# Import favorites and merge with existing
azpim favorites import ./my-favorites.json --merge
# Refresh the subscription cache
azpim favorites refresh
يقوم azpim تلقائيًا بتخزين معلومات الاشتراكات مؤقتًا لتحسين وقت بدء التشغيل. للذاكرة المؤقتة مدة صلاحية (TTL) مدتها 6 ساعات ويتم تحديثها تلقائيًا عند انتهائها.
يتم تخزين ملفات الذاكرة المؤقتة لكل مستخدم:
~/.config/azpim/users/<userId>/subscriptions-cache.json%APPDATA%\azpim\users\<userId>\subscriptions-cache.json# Force refresh the subscription cache
azpim favorites refresh
# Run in development mode with hot reload
pnpm dev
# Build the TypeScript project
pnpm build
# Run the built application
pnpm start
# Lint the codebase
pnpm lint
يستخدم هذا المستودع تنسيق Keep a Changelog في CHANGELOG.md.
للحصول على أفضل النتائج، استخدم Conventional Commits:
feat: ... (ميزة جديدة) → bump ثانويfix: ... (إصلاح خطأ) → bump تصحيحيchore: ...، docs: ...، refactor: ... (لا bump ما لم يكن breaking)تأكد من أن CHANGELOG.md يحتوي على إدخالات محدثة ضمن Unreleased.
قم بتشغيل أحد الأوامر التالية:
# Automatically determines next version from commits, updates CHANGELOG.md,
# bumps package.json, and creates a git tag.
pnpm release
# Preview what would change
pnpm release:dry
# Force a specific bump if needed
pnpm release -- --release-as patch
pnpm release -- --release-as minor
pnpm release -- --release-as major
git push --follow-tags
npm publish
# or
pnpm publish
azpim/
├── src/
│ ├── index.ts # CLI entry point and command definitions
│ ├── core/ # Foundational utilities (no domain logic)
│ │ ├── constants.ts # Shared magic values and defaults
│ │ ├── errors.ts # Unified error handling utilities
│ │ ├── json-store.ts # Generic JSON file persistence
│ │ ├── paths.ts # Config/data file path resolution
│ │ └── ui.ts # Terminal UI (spinners, formatting, colors)
│ ├── azure/ # Azure SDK wrappers
│ │ ├── auth.ts # Azure CLI credential + Graph /me lookup
│ │ └── azure-pim.ts # PIM role activation/deactivation API
│ ├── data/ # Local data persistence
│ │ ├── favorites.ts # Favorites management
│ │ ├── presets.ts # Preset configuration and validation
│ │ ├── subscription-cache.ts # Subscription caching (6-hour TTL)
│ │ └── update-check.ts # Update notification system
│ └── cli/ # Interactive flows and command scaffolding
│ ├── cli.ts # Main menu loop and shared helpers
│ ├── command-handler.ts # Reusable command wrapper (auth, UI, errors)
│ ├── activate-flow.ts # Role activation (one-shot + interactive)
│ ├── deactivate-flow.ts # Role deactivation (one-shot + interactive)
│ ├── subscription-selector.ts # Subscription search/select with favorites
│ ├── favorites-manager.ts # Interactive favorites management menu
│ └── presets-cli.ts # Preset add/edit/manage wizards
├── package.json
├── tsconfig.json
├── CHANGELOG.md
└── README.md
تتبع قاعدة البيانات هيكلًا معياريًا متعدد الطبقات:
core/ — أدوات مساعدة بدون تبعيات مشتركة عبر المشروع بأكمله. يوفر json-store.ts نمط تحميل/حفظ عام تستخدمه جميع ملفات استمرار البيانات. يقوم errors.ts بمركزة استخراج الأخطاء ومعالجة الأخطاء على مستوى الأوامر. يلغي constants.ts القيم السحرية.azure/ — أغلفة رقيقة حول Azure SDKs (@azure/identity، @azure/arm-authorization) واستدعاء خفيف الوزن لـ Microsoft Graph /me عبر fetch الأصلي. لا يوجد منطق واجهة مستخدم.data/ — استمرار البيانات المحلية (المفضلة، الإعدادات المسبقة، ذاكرة الاشتراكات المؤقتة، حالة التحديث). جميعها تستخدم json-store لإدخال/إخراج ملفات متسق.cli/ — تدفقات تفاعلية موجهة للمستخدم وسقالات الأوامر. يوفر command-handler.ts غلاف الذي يلغي النمط المتكرر (المصادقة، إعداد واجهة المستخدم، معالجة الأخطاء) عبر جميع أوامر Commander. تشارك تدفقات التفعيل وإلغاء التنشيط دالة من .تأكد من تثبيت Azure CLI وإمكانية الوصول إليه في PATH:
az --version
تأكد من تسجيل الدخول إلى Azure CLI:
az login
تحقق من أن حسابك لديه أدوار مؤهلة لـ PIM:
az account show
تحقق من امتلاكك للأذونات اللازمة في Azure AD
az login --refreshهذا المشروع مرخص بموجب رخصة ISC.
Tapan Meena - [email protected]
المساهمات مرحب بها! لا تتردد في تقديم طلب سحب (Pull Request).
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)| الأمر | الاسم المستعار | الوصف |
|---|
activate | a | تفعيل دور في Azure PIM (افتراضي) |
deactivate | d | إلغاء تنشيط دور في Azure PIM |
preset | - | إدارة الإعدادات المسبقة القابلة لإعادة الاستخدام |
favorites | fav | إدارة الاشتراكات المفضلة |
check-update | update, upgrade | التحقق من وجود إصدار أحدث |
help | - | عرض معلومات المساعدة |
| الأمر | الوصف |
|---|
preset list | سرد جميع الإعدادات المسبقة المتاحة |
preset show | عرض تفاصيل إعداد مسبق معين |
preset add | إضافة إعداد مسبق جديد (معالج تفاعلي) |
preset edit | تعديل إعداد مسبق موجود (معالج تفاعلي) |
preset remove | إزالة إعداد مسبق |
| الأمر | الوصف |
|---|
favorites list | سرد جميع الاشتراكات المفضلة |
favorites add | إضافة اشتراك إلى المفضلة |
favorites remove | إزالة اشتراك من المفضلة |
favorites clear | مسح جميع المفضلة |
favorites export | تصدير المفضلة إلى ملف |
favorites import | استيراد المفضلة من ملف |
favorites refresh | تحديث الذاكرة المؤقتة للاشتراكات |
withCommandHandlerselectSubscriptionInteractivesubscription-selector.ts| المتغير | الوصف |
|---|
AZPIM_PRESETS_PATH | تجاوز مسار ملف الإعدادات المسبقة |
AZPIM_FAVORITES_PATH | تجاوز مسار ملف المفضلة |
AZPIM_NO_UPDATE_NOTIFIER | عيّن إلى 1 لتعطيل فحص التحديثات التلقائي |
AZPIM_DISABLE_UPDATE_CHECK | اسم مستعار لـ AZPIM_NO_UPDATE_NOTIFIER |