{"id":31762298,"url":"https://github.com/pavelnovgorodov/inventory","last_synced_at":"2026-05-18T06:01:56.024Z","repository":{"id":318356753,"uuid":"1070907898","full_name":"PavelNovgorodov/Inventory","owner":"PavelNovgorodov","description":"Сбор инвентаризационной информации (установленное ПО, настройки ОС, параметры оборудования)","archived":false,"fork":false,"pushed_at":"2026-03-13T15:34:05.000Z","size":4669,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-14T03:54:58.459Z","etag":null,"topics":["automation","hardware-information","installed-programs","inventory","inventory-management","it-automation","powershell-script","scripts","system-administration","windows","winrm","wmi"],"latest_commit_sha":null,"homepage":"","language":"PowerShell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PavelNovgorodov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-06T15:42:30.000Z","updated_at":"2026-03-13T15:34:09.000Z","dependencies_parsed_at":"2026-05-18T06:01:55.419Z","dependency_job_id":null,"html_url":"https://github.com/PavelNovgorodov/Inventory","commit_stats":null,"previous_names":["pavelnovgorodov/inventory"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/PavelNovgorodov/Inventory","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PavelNovgorodov%2FInventory","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PavelNovgorodov%2FInventory/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PavelNovgorodov%2FInventory/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PavelNovgorodov%2FInventory/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PavelNovgorodov","download_url":"https://codeload.github.com/PavelNovgorodov/Inventory/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PavelNovgorodov%2FInventory/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33167429,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T05:43:36.989Z","status":"ssl_error","status_checked_at":"2026-05-18T05:43:19.133Z","response_time":71,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","hardware-information","installed-programs","inventory","inventory-management","it-automation","powershell-script","scripts","system-administration","windows","winrm","wmi"],"created_at":"2025-10-09T22:17:55.169Z","updated_at":"2026-05-18T06:01:56.017Z","avatar_url":"https://github.com/PavelNovgorodov.png","language":"PowerShell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Техническое задание на систему сбора инвентаризационной информации \"Inventory\"\n\n## 1. Введение\n\n### 1.1. Наименование проекта\nРазработка программного модуля \"Inventory\" – решения для автоматизированного сбора инвентаризационной информации с компьютеров под управлением ОС Windows на базе PowerShell.\n\n### 1.2. Цели создания\n- **Автоматизация процессов инвентаризации:** Устранение ручного труда при сборе инвентаризационной информации об аппаратном и программном обеспечении, настройках ОС.\n- **Обеспечение аудита и контроля:** Создание единого, актуального источника инвентаризационной информации для аудита лицензий ПО, проверки соответствия политикам безопасности, планирования модернизации.\n- **Оптимизация процессов поддержки:** Предоставление ИТ-специалистам инструмента для оперативной диагностики конфигурации удаленных и локальных компьютеров.\n- **Создание основы для анализа:** Формирование структурированного хранилища инвентаризационной информации для последующего анализа средствами BI (Excel Power Query).\n\n### 1.3. Область применения\n- **Регулярная инвентаризация IT-активов** в организациях с парком компьютеров под управлением Windows.\n- **Аудит лицензионного программного обеспечения.**\n- **Мониторинг состояния оборудования.**\n- **Сбор информации для подготовки требований** к закупкам и модернизации.\n- **Диагностика проблем** технической поддержкой.\n\n### 1.4. Состав работ\nНастоящим ТЗ описывается текущее состояние системы для целей:\n1. Формализации требований к эксплуатируемой системе.\n2. Создания базы для планирования дальнейших доработок и поддержки.\n3. Установки четких критериев приемки при передаче на сопровождение.\n\n## 2. Термины и определения\n\n| Термин | Определение |\n|--------|-------------|\n| Инвентаризационная информация | Информация об аппаратном обеспечении, установленном ПО, настройках ОС и системе, собираемые с компьютера |\n| Модуль сбора | Отдельный скрипт PowerShell (`.ps1` файл), ответственный за сбор одного конкретного типа инвентаризационной информации (например, `hwr.ps1`) |\n| Командлет | Основная выполняемая единица в PowerShell. В контексте системы – `Start-Inventory` |\n| OU (Organizational Unit) | Организационное подразделение в службе каталогов Active Directory, контейнер для объектов (компьютеров, пользователей) |\n| AD | Active Directory, служба каталогов Microsoft |\n| WinRM | Windows Remote Management (удаленное управление Windows) |\n| DMZ | Demilitarized Zone (демилитаризованная зона) - изолированный сетевой сегмент, предназначенный для размещения общедоступных сервисов |\n| WMI | Windows Management Instrumentation - инфраструктура управления системами Windows |\n\n## 3. Общие требования к системе\n\n### 3.1. Требования к окружению и платформе\n-   **Целевые операционные системы:** Windows 10 и выше; Windows Server 2012 R2 и выше.\n-   **Минимальная версия PowerShell:** 3.0 (для удаленного сбора и работы с AD). Для локального сбора достаточно PowerShell 2.0.\n-   **Необходимые компоненты:**\n    -   Для удаленного сбора: служба WinRM на целевых компьютерах.\n    -   Для получения списка компьютеров из AD: модуль PowerShell `ActiveDirectory` на компьютере-сборщике.\n    -   Для визуализации: Microsoft Excel с поддержкой Power Query (рекомендуется 2016 и выше).\n-   **Архитектура:** Файлово-ориентированная, без серверных компонентов и баз данных. Используется сетевой файловый ресурс в качестве центрального хранилища.\n\n### 3.2. Архитектурные требования и ограничения\n1.  **Гибридная модель сбора:** Система должна поддерживать **локальный** (запускаемый непосредственно на объекте сбора) и **удаленный** (запускаемый на компьютере-сборщике) сбор информации.\n2.  **Консолидация в едином хранилище:** Вся информация, независимо от метода и источника сбора (домен, изолированный сегмент, автономный компьютер), должны накапливаться и обрабатываться в единой структуре каталогов. Все рабочие каталоги системы могут указывать на сетевые ресурсы (UNC-пути).\n3.  **Поддержка изолированных сегментов (DMZ):** Для компьютеров без прямого сетевого доступа к центральному хранилищу должен быть предусмотрен сценарий **локального сбора с последующим ручным переносом** ZIP-архива.\n4.  **Модульность:** Функциональность сбора каждого типа информации должна быть инкапсулирована в независимый, подключаемый модуль. Добавление нового типа инвентаризационной информации не должно требовать изменения ядра системы.\n5.  **Идемпотентность:** Повторный запуск сбора с одних и тех же источников не должен приводить к дублированию информации в конечных результатах.\n\n#### 3.2.1 Преимущества архитектуры\n1. **Гибкость**: Поддержка различных сценариев сбора информации.\n2. **Масштабируемость**: Возможность постепенного добавления новых источников сбора и сбора новых типов информации.\n3. **Простота развертывания**: Не требует установки серверных компонентов или настройки баз данных.\n4. **Совместимость**: Единый формат информации для всех методов сбора.\n\n## 4. Функциональные требования\n\n### 4.1. Основные функции системы\n\n| ID | Наименование | Описание требования | Компонент реализации / Параметр |\n| :--- | :--- | :--- | :--- |\n| **FR-01** | Управление сбором через единый интерфейс | Весь функционал системы должен быть доступен через основной командлет `Start-Inventory` | `Start-Inventory.psm1` |\n| **FR-02** | Локальный сбор инвентаризационной информации | Сбор инвентаризационной информации непосредственно на компьютере, где запущен сбор, с сохранением информации в локальный или сетевой каталог | `-StartType InvLocal` |\n| \u003cnobr\u003e**FR-02.1** | Упаковка инвентаризационной информации в ZIP-архив | При локальном сборе результаты могут быть упакованы в ZIP-архив | `-InvFolderZIPFiles` |\n| **FR-03** | Удаленный сбор инвентаризационной информации | Сбор инвентаризационной информации с группы компьютеров, подключенных к сети, с использованием WinRM | `-StartType InvRemote` |\n| \u003cnobr\u003e**FR-03.1** | Управление источниками сбора инвентаризационной информации | Возможность вариантов выбора компьютеров с которых будет выполнен сбор  | `-InvOU`, `-InvComputerList` |\n| \u003cnobr\u003e**FR-03.1.1** | Получение списка из OU | Получение списка компьютеров из заданного OU домена | `-InvOU \"OU=...,DC=...\"` |\n| \u003cnobr\u003e**FR-03.1.2** | Перечисление имен компьютеров параметром  | Получение списка компьютеров через параметр командлета | `-InvComputerList \"Computer1\", \"Computer2\"` |\n| \u003cnobr\u003e**FR-03.1.3** | Чтение списка компьютеров из файла | Получение списка компьютеров из CSV файла | `-InvComputerList \"file:Computers.csv\"` |\n| **FR-04** | Выбор типов собираемой информации | Возможность выбора типов собираемой инвентаризационной информации | `-SelectInvType` |\n| **FR-04.1** | Интерактивный выбор типов через консоль | Командлет выдает перечень типов информации с возможностью выбора пользователем | `-SelectInvType select` |\n| **FR-04.2** | Указание конкретных типов | Указание конкретных типов через параметр командлета (например, ПО (\"swr\") и обновления ОС (\"hfx\")) | `-SelectInvType \"swr\", \"hfx\"` |\n| **FR-05** | Консолидация и обработка информации | Объединение файлов от отдельных компьютеров в итоговые файлы по типам информации | `-StartType CreateResult` |\n| \u003cnobr\u003e**FR-05.1** | Обработка ZIP архивов локального сбора | Автоматическое распаковка ZIP-архивов, полученных с автономных компьютеров, и включение информации из них в процесс консолидации | (часть `CreateResult`) |\n| \u003cnobr\u003e**FR-05.2** | Поддержка актуальности инвентаризационной информации | Автоматическое удаление устаревших файлов инвентаризации перед процессом консолидации | `-StartType CreateResult`, `-DayOld` |\n| **FR-06** | Расширяемость (добавление модулей) | Архитектура должна позволять добавлять новые типы собираемой информации путем создания файла модуля по стандарту, без изменения ядра системы | Каталог `Get-Inventory-Module\\` |\n| **FR-07** | Визуализация информации | Возможность визуализации и анализа с использованием BI системы  (Excel Power Query). В состав системы входит файл-шаблон inv.xlsx, содержащий предварительно настроенные подключения Power Query к консолидированным CSV-файлам в каталоге InvFolderResult. Шаблон позволяет автоматически загружать и обновлять данные для анализа. Структура шаблона не регламентируется настоящим ТЗ и может изменяться в соответствии с потребностями анализа. | Файл `inv.xlsx` |\n\n## 5. Нефункциональные требования\n\n| ID | Категория | Требование | Критерий приемки / Метрика |\n| :--- | :--- | :--- | :--- |\n| \u003cnobr\u003e**NFR-01** | **Производительность** | Минимальное влияние на производительность целевых систем при сборе инвентаризационной информации | Время сбора ≤ 5 минут на компьютере средней мощности (4 ядра CPU, 8 ГБ RAM) |\n| \u003cnobr\u003e**NFR-02** | **Производительность** | Система должна поддерживать механизм оптимизации производительности через проверку актуальности уже собранной информации | Если для компьютера уже существуют файлы инвентаризационной информации и их возраст меньше указанного значения (используется параметр, указывающий максимальный допустимый возраст файлов инвентаризационной информации в днях), сбор с этого компьютера пропускается. При этом значение параметра по умолчанию обеспечивает выполнение сбора без проверки актуальности |\n| \u003cnobr\u003e**NFR-03** | **Надежность** | Устойчивость к ошибкам на отдельных целевых компьютерах | При недоступности или ошибке на одном компьютере сбор продолжается для остальных, ошибка логируется |\n| \u003cnobr\u003e**NFR-04** | **Надежность** | Предварительная проверка наличия необходимых прав доступа при удаленном сборе | Перед началом сбора с удаленного компьютера система проверяет наличие административных прав у используемой учетной записи. При отсутствии необходимых прав система логирует ошибку и пропускает данный компьютер |\n| \u003cnobr\u003e**NFR-05** | **Надежность** | Предварительная проверка доступности компьютеров в сети | Перед началом сбора система проверяет сетевую доступность компьютера и доступность механизма удаленного управления. Для недоступных компьютеров сбор пропускается, система логирует ошибку и пропускает данный компьютер |\n| \u003cnobr\u003e**NFR-06** | **Надежность** | Автоматическая проверка и создание требуемых рабочих каталогов | При запуске система проверяет наличие всех необходимых рабочих каталогов. В случае отсутствия каталогов система автоматически их создает |\n| \u003cnobr\u003e**NFR-07** | **Надежность** | Автоматическая самоконфигурация при определенных условиях | При запуске удаленного сбора без явного указания источников, если компьютер включен в домен Active Directory, система автоматически определяет контекст для сбора - OU компьютера на котором запущен сбор |\n| \u003cnobr\u003e**NFR-08** | **Надежность** | Ведение операционного лога | Система ведет структурированный лог-файл в каталоге `InvFolderLog`. |\n| \u003cnobr\u003e**NFR-08.1** | **Надежность** | Ротация лог-файлов процедур удаленного сбора и консолидации информации | Логи ведутся в отдельных файлах по дате выполнения. Старые файлы удаляются, система обеспечивает хранение не более 20 лог-файлов |\n| \u003cnobr\u003e**NFR-08.2** | **Надежность** | Ограничение размера лог-файлов локального сбора | Логи ведутся в файле по имени компьютера. Система обеспечивает контроль размера файла не более 20Кб, после превышения размера файл пересоздается |\n| \u003cnobr\u003e**NFR-09** | **Безопасность** | Контроль доступа к информации | Права NTFS на каталогах с инвентаризационной информацией должны следовать принципу наименьших привилегий. |\n| \u003cnobr\u003e**NFR-10** | **Удобство использования** | Наличие встроенной справки | Полноценная справка доступна через `Get-Help Start-Inventory -Full`, включая описания параметров и примеры |\n| \u003cnobr\u003e**NFR-11** | **Портативность** | Отсутствие жесткой привязки к окружению | Система не требует установки в GAC (Global Assembly Cache, Глобальный кэш сборок), регистрации в системе. Развертывание — копирование файлов |\n\n\n## 6. Пользовательские истории (User Stories)\n\n**US-01**: Как системный администратор, я хочу собрать инвентаризационную информацию обо всех компьютерах в моем домене, чтобы иметь актуальную информацию об оборудовании и ПО.\n\n**Критерии приемки:**  \n   - Система собирает все типы инвентаризационной информации со всех компьютеров в указанном OU домена.\n   - Результаты консолидируются в файлы по типам информации, доступные для анализа в Excel.\n    \n```yaml\n# US-01: Сбор инвентаризационной информации c компьютеров включенных в домен\nid: \"US-01\"\ntitle: \"Сбор инвентаризационной информации c компьютеров включенных в домен\"\nrole: \"системный администратор\"\ngoal: \"собрать инвентаризационную информацию обо всех компьютерах в моем домене\"\nbenefit: \"иметь актуальную инвентаризацию оборудования и ПО\"\ncontext: |\n  В организации с парком 200+ компьютеров ручной сбор инвентаризационной информации невозможен.\n  Требуется автоматизированный процесс получения информации.\nacceptance_criteria:\n  - \"Система собирает все типы инвентаризационной информации со всех компьютеров в указанном OU домена\"\n  - \"Результаты консолидируются в файлы по типам информации, доступные для анализа в Excel\"\npriority: \"high\"\nimplementation_complexity: \"medium\"\nlinked_requirements: [\"FR-03\", \"FR-03.1\", \"FR-03.1.1\", \"FR-05\"]\ntest_scenario: |\n  1. Выполнить команду:\n     `Start-Inventory -StartType InvRemoteCreateResult -InvOU \"OU=Computers,DC=company,DC=local\" -InvFolderAnyComputers \\\\fileserver\\inventory\\InvAnyComputers -InvFolderResult \\\\fileserver\\inventory\\InvResult`\n  2. Дождаться выполнения процедуры сбора\n  3. Проверить наличие файлов по компьютерам в каталоге \\\\fileserver\\inventory\\InvAnyComputers\n  4. Проверить наличие консолидированных файлов (в количестве 19) в каталоге \\\\fileserver\\inventory\\InvResults\n  5. Открыть файл inv.xlsm, выполнить обновление информации, убедиться в наличии информации\n```\n\n----\n\n**US-02**: Как системный администратор, я хочу собрать инвентаризационную информацию с автономного компьютера, чтобы иметь актуальную информацию об оборудовании и ПО.\n\n**Критерии приемки:**\n   - Скрипты системы расположены в локальном каталоге из которого осуществляется запуск.\n   - Система собирает все типы инвентаризационной информации с автономного компьютера.\n   - Собранная информация размещается в локальном каталоге.\n   - Файлы с инвентаризационной информацией для ручного переноса помещаются в ZIP-архивов.\n\n```yaml\n# US-02: Сбор информации с автономного компьютера\nid: \"US-02\"\ntitle: \"Сбор информации с автономного компьютера\"\nrole: \"системный администратор\"\ngoal: \"собрать информацию только с автономного компьютера\"\nbenefit: \"иметь актуальную инвентаризацию оборудования и ПО\"\ncontext: |\n    Автономный компьютер не имеет доступ во внутреннюю сеть.\n    Процесс сбора запускается непосредственно на компьютере.\nacceptance_criteria:\n  - \"Скрипты системы расположены в локальном каталоге из которого осуществляется запуск\"\n  - \"Система собирает все типы инвентаризационной информации с автономного компьютера\"\n  - \"Собранная информация размещается в локальном каталоге\"\n  - \"Файлы с инвентаризационной информацией для ручного переноса помещаются в ZIP-архивов\"\npriority: \"medium\"\nimplementation_complexity: \"medium\"\nlinked_requirements: [\"FR-02\", \"FR-02.1\"]\ntest_scenario: |\n    1. На автономном компьютере скопировать скрипты системы в каталог C:\\Inventory\n    2. Выполнить команду:\n       'Start-Inventory -StartType InvLocal -InvFolderAnyComputers C:\\Inventory\\InvAnyComputers -InvFolderZIPFiles C:\\Inventory\\ZIP`\n    3. Проверить формирование файлов в каталоге C:\\Inventory\\InvAnyComputers\n    4. Проверить формирование ZIP файла в каталоге C:\\Inventory\\ZIP\n```\n\n---\n\n**US-03**: Как системный администратор, я хочу выбрать только определенные типы инвентаризационной информации, чтобы сократить время сбора и объем инвентаризационной информации.\n\n**Критерии приемки:**\n   - Система поддерживает выбор конкретных типов информации через параметр командлета.\n   - Имеется интерактивный режим выбора типов.\n   - Возможность указания списка типов через параметр.\n   - При выборе подмножества типов собирается только указанная информация.\n   - Результаты консолидируются в файлы по типам информации, доступные для анализа в Excel.\n \n ```yaml\n# US-03: Выборочный сбор определенных типов информации\nid: US-03\ntitle: \"Выборочный сбор определенных типов информации\"\nrole: \"системный администратор\"\ngoal: \"собрать информацию только определенного типа с компьютеров в моем домене\"\nbenefit: \"сократить время сбора и объем инвентаризационной информации\"\ncontext: |\n  Для решения конкретных задач не требуется полный сбор всех 19 типов информации.\n  Необходима возможность выбора только нужных типов информации.\nacceptance_criteria:\n    - \"Система поддерживает выбор конкретных типов информации через параметр командлета\"\n    - \"Имеется интерактивный режим выбора типов\"\n    - \"Возможность указания списка типов через параметр\"\n    - \"При выборе подмножества типов собирается только указанная информация\"\n    - \"Результаты консолидируются в файлы по типам информации, доступные для анализа в Excel\"\npriority: \"medium\"\nimplementation_complexity: \"medium\"\nlinked_requirements: [\"FR-03\", \"FR-03.1\", \"FR-03.1.1\", \"FR-04\", \"FR-04.1\", \"FR-04.2\", \"FR-05\"]\ntest_scenario: |\n    1. Выполнить команду:\n        `Start-Inventory -StartType InvRemoteCreateResult -InvOU \"OU=Computers,DC=company,DC=local\" -SelectInvType hwr,swr,net -InvFolderAnyComputers \\\\fileserver\\inventory\\InvAnyComputers -InvFolderResult \\\\fileserver\\inventory\\InvResult`\n    2. Дождаться выполнения процедуры сбора\n    3. Проверить создание в каталоге \\\\fileserver\\inventory\\InvResult только файлов: hwr.csv, swr.csv, net.csv\n    4. Убедиться, что другие типы информации не собраны\n    5. Выполнить команду:\n        `Start-Inventory -StartType InvRemoteCreateResult -InvOU \"OU=Computers,DC=company,DC=local\" -SelectInvType select -InvFolderAnyComputers \\\\fileserver\\inventory\\InvAnyComputers -InvFolderResult \\\\fileserver\\inventory\\InvResult`\n    6. Убедится в возможности интерактивного выбора типов инвентаризационной информации\n    7. Выбрать тип Логические диски (dsk)\n    8. Дождаться выполнения процедуры сбора\n    9. Проверить создание в каталоге \\\\fileserver\\inventory\\InvAnyComputers файла: dsk.csv\n```\n\n---\n\n**US-04**: Как IT-менеджер, я хочу получить полную инвентаризационную информацию, актуальностью 60 дней, собранную с сетевых и автономных компьютеров, чтобы провести анализ использования дискового пространства на компьютерах.\n\n**Критерии приемки:**\n   - Инвентаризационная информация предварительно собрана системным администратором с сетевых и автономных компьютеров и размещена в соответствующих каталогах.\n   - Система обрабатывает ZIP архивы файлами полученными с автономных компьютеров.\n   - Система удаляет файлы с инвентаризационной информацией старше 60 дней.\n   - Информация с сетевых и автономных компьютеров консолидируются.\n   - Возможность идентификации компьютеров с недостатком места.\n\n```yaml\n# US-04: Объединение инвентаризационной информации для анализа\nid: \"US-04\"\ntitle: \"Объединение инвентаризационной информации для анализа\"\nrole: \"IT-менеджер\"\ngoal: \"анализировать использование дискового пространства на сетевых и автономных компьютерах на основе инвентаризационной информации\"\nbenefit: \"оптимизировать хранение информации\"\ncontext: |\n    На серверах и рабочих станциях заканчивается свободное дисковое пространство.\n    Требуется выявить компьютеры с критически малым свободным местом.\nacceptance_criteria:\n     - \"Инвентаризационная информация предварительно собрана системным администратором с сетевых и автономных компьютеров и размещена в соответствующих каталогах\"\n     - \"Система обрабатывает ZIP архивы файлами полученными с автономных компьютеров\"\n     - \"Система удаляет файлы с инвентаризационной информацией старше 60 дней\"\n     - \"Информация с сетевых и автономных компьютеров консолидируются\"\n     - \"Возможность идентификации компьютеров с недостатком места\"\npriority: \"medium\"\nimplementation_complexity: \"medium\"\nlinked_requirements: [\"FR-05\", \"FR-05.1\", \"FR-05.2\"]\ntest_scenario: |\n    1. Выполнить команду:\n    `Start-Inventory -StartType InvCreateResult -InvFolderAnyComputers \\\\fileserver\\inventory\\InvAnyComputers -InvFolderZIPFiles \\\\fileserver\\inventory\\ZIP -InvFolderResult \\\\fileserver\\inventory\\InvResult -DayOld 60`\n    2. Проверить что в каталоге \\\\fileserver\\inventory\\InvAnyComputers нет файлов старше 60 дней\n    3. Открыть Excel-отчет, выполнить обновление информации\n    4. В Excel-отчете на листе 'dsk' отсортировать по полю FreeSpace\n```\n\n---\n\n**US-05**: Как системный администратор, я хочу использовать разные методы сбора для разных сегментов сети (удаленный сбор для доверенного сегмента, локальный сбор для DMZ) из соображений безопасности.\n\n**Критерии приемки:**\n   - Для DMZ: локальный сбор + ручной перенос ZIP-архивов.\n   - Для внутренней сети: удаленный сбор через WinRM.\n   - Единый формат информации для обоих методов.\n   - Автоматическое объединение информации при обработке.\n\n```yaml\n# US-05: Использование разных методов сбора\nid: \"US-05\"\ntitle: \"Использование разных методов сбора\"\nrole: \"системный администратор\"\ngoal: \"использовать разные методы сбора для разных сегментов сети\"\nbenefit: \"соблюдать политики безопасности для DMZ и изолированных сетей\"\ncontext: |\n    Компьютеры в DMZ имеют ограниченный доступ во внутреннюю сеть.\n    Прямой удаленный сбор через WinRM из внутренней сети невозможен.\nacceptance_criteria:\n    - \"Для DMZ: локальный сбор + ручной перенос ZIP-архивов\"\n    - \"Для внутренней сети: удаленный сбор через WinRM\"\n    - \"Единый формат информации для обоих методов\"\n    - \"Автоматическое объединение информации при обработке\"\npriority: \"medium\"\nimplementation_complexity: \"medium\"\nlinked_requirements: [\"FR-02\", \"FR-02.1\", \"FR-03\", \"FR-03.1\", \"FR-03.1.1\", \"FR-05\", \"FR-05.1\"]\ntest_scenario: |\n    1. На компьютерах в DMZ настроить локальный сбор в ZIP\n    2. Вручную скопировать архивы в \\\\fileserver\\inventory\\ZIP\\\n    3. Для внутренней сети выполнить удаленный сбор в каталог \\\\fileserver\\inventory\\InvAnyComputers\n    4. Запустить CreateResult для объединения информации\n    `Start-Inventory -StartType InvCreateResult -InvFolderAnyComputers \\\\fileserver\\inventory\\InvAnyComputers -InvFolderResult \\\\fileserver\\inventory\\InvResult -InvFolderZIPFiles \\\\fileserver\\inventory\\ZIP`\n```\n\n**US-6**: Как системный администратор, я хочу получать инвентаризационную информацию с сетевых компьютеров без использования удаленного сбора (с компьютеров на которых отключена служба удаленного управления).\n\n**Критерии приемки:**\n   - На компьютере создано задание в системном планировщике для запуска локального сбора в сетевой каталог.\n   - Скрипты системы расположены в сетевом каталоге из которого осуществляется запуск.\n   - Собранная информация размещается в сетевом каталоге.\n\n```yaml\n# US-06: Асинхронный сбор с сетевых компьютеров\nid: \"US-06\"\ntitle: \"Асинхронный сбор с сетевых компьютеров\"\nrole: \"системный администратор\"\ngoal: \"использовать локальный сбор для сетевых компьютеров\"\nbenefit: \"получать инвентаризационную информацию с компьютеров с которых невозможно собрать информацию удаленно\"\ncontext: |\n    На части компьютеров в организации не включена служба удаленного управления.\n    На части компьютеров запрещен удаленный сбор и администратор не имеет административных прав на них. \n    Компьютеры в организации включаются в разное время или могут быть выключены в течении неопределенного периода, из-за чего удаленный сбор не всегда эффективен.\nacceptance_criteria:\n    - \"На компьютере создано задание в системном планировщике для запуска локального сбора в сетевой каталог\"\n    - \"Скрипты системы расположены в сетевом каталоге из которого осуществляется запуск\"\n    - \"Собранная информация размещается в сетевом каталоге\"\npriority: \"medium\"\nimplementation_complexity: \"medium\"\nlinked_requirements: [\"FR-02\"]\ntest_scenario: |\n    1. На компьютерах настроить задание планировщика с запуском из сетевого каталога \\\\fileserver\\inventory\\\\Src и размещением файлов в \\\\fileserver\\inventory\\InvAnyComputers\n    2. Дождаться выполнения задания планировщика\n    3. Проверить появление файлов в каталоге \\\\fileserver\\inventory\\InvAnyComputers\n```\n\n## 7. Сценарии использования (Use Case)\n\n### 7.1. Общие включаемые сценарии (Include)\n\n*Вспомогательные сценарии, выполняющие проверки и подготовительные действия.*\n\n*Примечание: Альтернативные потоки, связанные с общесистемными механизмами (проверка доступности, прав, актуальности информации, создание каталогов), описаны в соответствующих включаемых сценариях (UC-INC-01 — UC-INC-05) и не дублируются в каждом основном Use Case. В основных сценариях приводятся только уникальные альтернативы, специфичные для данного потока.*\n\n---\n\n**UC-INC-01**: Проверка и подготовка инфраструктуры.\n\n- **Актор:** Система.\n- **Описание:** Базовые проверки перед началом любой операции сбора или обработки информации.\n- **Включается в:** Все основные Use Cases.\n- **Основной поток:**\n    1. Система проверяет наличие всех обязательных каталогов, указанных в параметрах командлета:\n        - Если параметры `InvFolderResult` или `InvFolderAnyComputers` не указаны, система создает требуемые каталоги в каталоге запуска скрипта (NFR-06).\n        - Если каталоги `InvFolderResult` или `InvFolderAnyComputers` недоступны, генерируется исключение.\n    2. Система проверяет наличие каталога размещения лог-файлов:\n        - Если параметр `InvFolderLog` не указан, лог-файл не ведется.\n        - Если каталог `InvFolderLog` недоступен, лог-файл не ведется.\n    3. Система выполняет ротацию лог-файлов (NFR-08.1, NFR-08.2):\n        - Для удаленного сбора/консолидации: оставляет не более 20 последних файлов.\n        - Для локального сбора: контролирует размер файла (не более 20Кб).\n\n---\n\n**UC-INC-02**: Проверка актуальности информации.\n\n- **Актор:** Система.\n- **Описание:** Проверка, требуется ли выполнять сбор для конкретного компьютера на основе возраста существующей информации.\n- **Включается в:** UC-01, UC-02, UC-03, UC-06.\n- **Предусловие:** Задан параметр `DayOld` для локального сбора и `InvRemoteDayOld` для удаленного сбора.\n- **Основной поток:**\n    1. Система проверяет наличие в каталоге `InvFolderAnyComputers` файлов для данного компьютера по шаблону `ИмяКомпьютера.*.csv`.\n    2. Если файлы существуют:\n        - Определяется дата самого свежего файла.\n        - Вычисляется разница в днях между текущей датой и датой файла.\n        - Если разница меньше или равна `DayOld` для локального сбора, или `InvRemoteDayOld` для удаленного сбора, система пропускает сбор для этого компьютера (логирует пропуск) (NRF-02)\n    3. Если файлы не существуют или их возраст превышает `DayOld`|`InvRemoteDayOld`, сбор выполняется.\n- **Альтернативный поток:**\n    - Если параметры `DayOld` или `InvRemoteDayOld` не указан (NFR-02):\n        - Проверка пропускается, сбор выполняется для всех компьютеров.\n\n---\n\n**UC-INC-03**: Получение перечня компьютеров.\n\n- **Актор:** Система.\n- **Описание:** Проверка корректности и непротиворечивости параметров (определяющих список целевых компьютеров), получение списка компьютеров.\n- **Включается в:** UC-01, UC-03, UC-05.\n- **Основной поток:**\n    1. Система проверяет одновременное указание взаимоисключающих параметров (`InvOU` и `InvComputerList`):\n       - Если указаны оба - выводится сообщение, выполнение прекращается.\n    2. Если `InvComputerList` начинается с префикса `file:` (FR-03.1.3):\n       - Система проверяет наличие указанного файла.\n       - Если файл существует - система получает перечень компьютеров из файла.\n       - Если файл не существует - система выдает сообщение и прекращает выполнение.\n    3. Если `InvComputerList` не пустой и не начинается с префикса `file:` (FR-03.1.2\t):\n       - Система получает перечень компьютеров из значений параметра `InvComputerList`.\n    4. Если `InvOU` задан:\n       - Система проверяет наличие модуля ActiveDirectory:\n           - Если модуль отсутствует - выводится сообщение с инструкцией по установке, выполнение прекращается.\n           - Если модуль существует - система проверяет наличие `InvOU` в домене.\n           - Если OU не существует - система выдает сообщение и прекращает выполнение.\n    5. Если `InvOU` не задан:\n       - Система определяет текущее OU компьютера, на котором запущен процесс и использует его в качестве значения `InvOU` (NFR-07).\n       - Выводит информационное сообщение об использовании текущего OU.\n    6. Система получает перечень компьютер в `InvOU` (если параметр `DayOld` задан, получает только компьютеры активные в течении `DayOld` дней) (FR-03.1.1).\n    7. Формируется итоговый список компьютеров для обработки.\n\n---\n\n**UC-INC-04**: Проверка доступности компьютера.\n\n- **Актор:** Система.\n- **Описание:** Проверка возможности удаленного подключения к целевому компьютеру.\n- **Включается в:** UC-01, UC-03, UC-05.\n- **Предусловие:** Получен список компьютеров для обработки.\n- **Основной поток (для каждого компьютера в списке):**\n    1. Система проверяет сетевую доступность компьютера (Test-Connection):\n        - Если компьютер недоступен — логируется ошибка, компьютер пропускается (NFR-05).\n    2. Система проверяет доступность службы WinRM (Test-WSMan):\n        - Если служба недоступна — логируется ошибка, компьютер пропускается (NFR-05).\n    3. Система проверяет наличие административных прав на целевом компьютере:\n        - Если прав недостаточно — логируется ошибка, компьютер пропускается (NFR-04).\n    4. Если все проверки пройдены, устанавливается CIM-сессия для сбора информации.\n\n---\n\n**UC-INC-05**: Валидация типов собираемой информации.\n- **Актор:** Система.\n- **Описание:** Проверка корректности параметров, определяющих список типов собираемой информации, получение списка типов собираемой информации.\n- **Включается в:** UC-01, UC-02, UC-03, UC-05.\n- **Основной поток:**\n    1. Система валидирует переданные типы информации в параметре `SelectInvType` (FR-04.2):\n        - Каждый тип проверяется на наличие соответствующего модуля в каталоге `Get-Inventory-Module\\`.\n        - Если тип не является корректным, выводится предупреждение, тип исключается из сбора.\n- **Альтернативные потоки:**\n    1. **Интерактивный выбор типов:**\n        - При значении параметра `SelectInvType select` система выводит список всех доступных типов с возможностью множественного выбора (FR-04.1).\n        - Пользователь выбирает требуемые типы.\n        - Если пользователь отказался от выбора (закрыл окно выбора), сбор прекращается.\n        - Выполняется сбор только выбранных типов.\n    2. Если после валидации типов список оказался пуст (все указанные типы некорректны) — сбор прекращается с сообщением об ошибке.\n\n---\n\n### 7.2. Основные сценарии использования\n\n**Акторы:**\n- Системный администратор (Admin).\n- IT-менеджер (Manager).\n- Автоматизированная задача (Scheduled Task).\n\n---\n\n**UC-01**: Удаленный сбор инвентаризационной информации со всего домена.\n\n- **Актор:** Admin.\n- **Описание:** Полный цикл удаленного сбора и консолидации информации со всех компьютеров в заданном OU домена.\n- **Включает:** UC-INC-01, UC-INC-03, UC-INC-05. Для каждого компьютера: UC-INC-04. Для каждого компьютера, если указан InvRemoteDayOld: UC-INC-02.\n- **Предусловие:** Наличие прав администратора на компьютерах в домене, доступ к сетевому каталогу для хранения информации.\n- **Основной поток:**\n    1. Администратор запускает PowerShell под учетной записью с правами администратора на компьютерах в домене.\n    2. Выполняет командлет:\n       ```powershell\n       Start-Inventory -StartType InvRemoteCreateResult -InvOU \"OU=Workstations,DC=company,DC=local\" -InvFolderAnyComputers \\\\fileserver\\inventory\\InvAnyComputers -InvFolderResult \\\\fileserver\\inventory\\InvResult -InvFolderLog \\\\fileserver\\inventory\\Logs -DayOld 60 -InvRemoteDayOld 5\n       ```\n    3. Система выполняет UC-INC-01 (Проверка и подготовка инфраструктуры).\n    4. Система выполняет UC-INC-05 (Валидация типов собираемой информации), получая список типов информации.\n    5. Система выполняет UC-INC-03 (Получение перечня компьютеров), получая список компьютеров из указанного OU.\n    6. Для каждого компьютера из полученного списка:\n        - Если указан параметр `InvRemoteDayOld`, система выполняет UC-INC-02 (Проверка актуальности информации).\n        - Если требуется сбор (информация устарела или отсутствует), система выполняет UC-INC-04 (Проверка доступности компьютера).\n        - Если компьютер доступен:\n            - Для каждого типа информации из полученного списка типов:\n                * Загружается соответствующий модуль из каталога `Get-Inventory-Module\\`.\n                * Выполняется удаленный сбор инвентаризационной информации через установленную CIM-сессию.\n                * Результат сохраняется в файл формата `ИмяКомпьютера.КодТипа.csv` в каталоге `InvFolderAnyComputers`.\n            - При ошибке в одном модуле сбор продолжается для остальных, ошибка логируется.\n    7. После завершения сбора со всех доступных компьютеров запускается процедура консолидации:\n        - Если указан параметр `DayOld`, в каталоге `InvFolderAnyComputers` удаляются файлы инвентаризации старше указанного количества дней.\n        - Система сканирует каталог `InvFolderAnyComputers` и группирует файлы по списку типов информации.\n        - Для каждого типа информации создается итоговый файл `Тип.csv` в каталоге `InvFolderResult`.\n- **Постусловие:** Инвентаризационная информация собрана и доступна для анализа в Excel-отчете `inv.xlsm`.\n- **Альтернативные потоки:**\n    1. Если после завершения сбора не было собрано информации ни с одного компьютера (все недоступны или вся информация актуальны), система выводит предупреждение \"Нет информации для консолидации\" и завершает выполнение без создания итоговых файлов.\n- **Исключения:**\n    1. Если учетная запись под которой запущен процесс не имеет административных прав на целевом компьютере, система выводит предупреждение и переходит к следующему компьютеру (NFR-04).\n    2. Если при выполнении сбора произошла критическая ошибка, делающая невозможным продолжение, процесс прерывается, частично собранная информация сохраняются.\n\n---\n\n**UC-02**: Локальный сбор инвентаризационной информации с автономного компьютера.\n\n- **Актор:** Scheduled Task.\n- **Описание:** Сбор инвентаризационной информации непосредственно на компьютере с последующей упаковкой в ZIP-архив для ручного переноса.\n- **Включает:** UC-INC-01, UC-INC-05. UC-INC-02 (если указан DayOld).\n- **Предусловие:** Настроенная задача в планировщике Windows, скрипты системы размещены в локальном или сетевом каталоге.\n- **Основной поток:**\n    1. Планировщик задач запускает командный файл `InvLocal.cmd` от имени SYSTEM.\n    2. Выполняется PowerShell скрипт `InvLocal.ps1` с параметрами:\n        - `StartType = \"InvLocal\"`\n        - `InvFolderAnyComputers` (путь для сохранения собранной информации)\n        - `InvFolderZIPFiles` (путь для сохранения архивов)\n        - `DayOld` (актуальность информации в днях)\n        - `InvFolderLog` (путь для сохранения логов)\n    3. Система выполняет UC-INC-01 (Проверка и подготовка инфраструктуры).\n    4. Система выполняет UC-INC-05 (Валидация типов собираемой информации), получая список типов информации.\n    5. Если указан параметр `DayOld`, система выполняет UC-INC-02 (Проверка актуальности информации) для данного компьютера.\n    6. Если требуется сбор (информация устарела или отсутствует):\n        - Для каждого типа информации из полученного списка типов:\n            * Загружается соответствующий модуль из каталога `Get-Inventory-Module\\`.\n            * Выполняется локальный сбор инвентаризационной информации.\n            * Результат сохраняется в файл формата `ИмяКомпьютера.КодТипа.csv` в каталоге `InvFolderAnyComputers`.\n        - При ошибке в одном модуле сбор продолжается для остальных, ошибка логируется.\n    7. Если указан параметр `InvFolderZIPFiles`:\n        - Система упаковывает все собранные файлы в ZIP-архив с именем по шаблону: `inv.ИмяКомпьютера.zip`.\n        - ZIP-архив сохраняется в каталоге `InvFolderZIPFiles`.\n- **Постусловие:** ZIP-архив с инвентаризационной информацией готов для ручного переноса в центральное хранилище.\n- **Альтернативные потоки:**\n    1. Если параметр `InvFolderZIPFiles` не указан, упаковка в архив не выполняется, информации остается в `InvFolderAnyComputers`.\n\n---\n\n**UC-03**: Выборочный сбор определенных типов инвентаризационной информации.\n\n- **Актор:** Admin.\n- **Описание:** Сбор только указанных типов инвентаризационной информации с конкретных компьютеров для решения узких задач.\n- **Включает:** UC-INC-01, UC-INC-03, UC-INC-05. Для каждого компьютера: UC-INC-04. Для каждого компьютера, если указан InvRemoteDayOld: UC-INC-02.\n- **Предусловие:** Определены типы информации для сбора, доступ с правами администратора к целевым компьютерам.\n- **Основной поток:**\n    1. Администратор запускает PowerShell.\n    2. Выполняет командлет с параметром выбора типов и указанием целевых компьютеров:\n       ```powershell\n       Start-Inventory -StartType InvRemote -SelectInvType hwr,swr,net -InvComputerList PC-01,PC-02 -InvFolderAnyComputers \\\\fileserver\\inventory\\InvAnyComputers\n       ```\n    3. Система выполняет UC-INC-01 (Проверка и подготовка инфраструктуры).\n    4. Система выполняет UC-INC-05 (Валидация типов собираемой информации), получая список типов информации.\n    5. Система выполняет UC-INC-03 (Получение перечня компьютеров), получая список целевых компьютеров.\n    7. Для каждого компьютера из полученного списка:\n        - Если указан параметр `InvRemoteDayOld`, система выполняет UC-INC-02 (Проверка актуальности информации) для данного компьютера.\n        - Если требуется сбор, система выполняет UC-INC-04 (Проверка доступности компьютера).\n        - Если компьютер доступен:\n            - Для каждого типа информации из списка типов:\n                * Загружается соответствующий модуль.\n                * Выполняется удаленный сбор инвентаризационной информации через установленную CIM-сессию.\n                * Результат сохраняется в файл формата `ИмяКомпьютера.КодТипа.csv` в каталоге `InvFolderAnyComputers`.\n- **Постусловие:** Специализированная инвентаризационная информация собрана и готова для анализа.\n- **Альтернативные потоки:** (аналогично UC-01).\n- **Исключения:** (аналогично UC-01).\n\n---\n\n**UC-04**: Объединение инвентаризационной информации для анализа.\n\n- **Актор:** Manager.\n- **Описание:** Обработка ранее собранной инвентаризационной информации, включая распаковку ZIP-архивов и консолидацию.\n- **Включает:** UC-INC-01.\n- **Предусловие:** Наличие собранной информации в каталоге `InvFolderAnyComputers` и/или ZIP-файлов в каталоге `InvFolderZIPFiles`.\n- **Основной поток:**\n    1. Менеджер запускает процедуру обработки:\n       ```powershell\n       Start-Inventory -StartType CreateResult -DayOld 30 -InvFolderAnyComputers \\\\fileserver\\inventory\\InvAnyComputers -InvFolderZIPFiles \\\\fileserver\\inventory\\ZIP -InvFolderResult \\\\fileserver\\inventory\\InvResult\n       ```\n    2. Система выполняет UC-INC-01 (Проверка и подготовка инфраструктуры).\n    3. Если указан параметр `InvFolderZIPFiles` и каталог существует:\n        - Система сканирует каталог на наличие ZIP-файлов по шаблону `inv.*.zip`.\n        - Для каждого ZIP-файла:\n            - Выполняется распаковка в каталог `InvFolderAnyComputers`.\n            - Если файл с таким именем уже существует, он перезаписывается.\n            - Если архив поврежден, система логирует ошибку и пропускает файл.\n    4. Запускается процедура консолидации информации:\n        - Если указан параметр `DayOld`, в каталоге `InvFolderAnyComputers` удаляются файлы инвентаризации старше указанного количества дней.\n        - Система сканирует каталог `InvFolderAnyComputers` и группирует файлы по типу информации.\n        - Для каждого типа информации создается итоговый файл `Тип.csv` в каталоге `InvFolderResult`.\n- **Постусловие:** Консолидированная инвентаризационная информация готова для импорта в Excel и анализа.\n- **Альтернативные потоки:**\n    1. Если параметр `InvFolderZIPFiles` не указан или каталог не существует, этап распаковки пропускается.\n    2. Если после распаковки в `InvFolderAnyComputers` не обнаружено CSV-файлов, система выводит предупреждение и завершает выполнение.\n- **Исключения:**\n    1. Каталог `InvFolderResult` недоступен для записи — выполнение прекращается.\n\n---\n\n**UC-05**: Гибридный сбор из разных доменов и сегментов сети.\n\n- **Актор:** Admin.\n- **Описание:** Комбинированный сбор инвентаризационной информации из различных источников (разные домены, DMZ, изолированные сети) в единую инвентаризационную базу.\n- **Включает:** UC-INC-01, UC-INC-05, UC-INC-03 (для каждого домена).\n- **Предусловие:** Наличие компьютеров в разных доменах и сетевых сегментах, учетные данные для каждого домена.\n- **Основной поток:**\n    1. **Сбор из основного домена:**\n        - Администратор запускает PowerShell под учетной записью с правами в domain1.\n        - Выполняется командлет с параметрами для первого домена:\n          ```powershell\n          Start-Inventory -StartType InvRemote -InvOU \"OU=Computers,DC=domain1,DC=local\" -InvFolderAnyComputers \\\\fileserver\\inventory\\InvAnyComputers\n          ```\n        - Система выполняет UC-INC-01, UC-INC-03, UC-INC-05.\n        - Для каждого компьютера из OU domain1 выполняется сбор инвентаризационной информации (аналогично UC-01, шаг 6, без финальной консолидации).\n    2. **Сбор из дополнительного домена:**\n        - Администратор запускает PowerShell под учетной записью с правами в domain2.\n        - Выполняется аналогичный командлет для domain2 с указанием того же `InvFolderAnyComputers`.\n    3. **Сбор из DMZ/изолированного сегмента:**\n        - На компьютерах в DMZ выполняется UC-02 (Локальный сбор) с упаковкой в ZIP.\n        - ZIP-архивы вручную переносятся в каталог `InvFolderZIPFiles` центрального хранилища.\n    4. **Финальная консолидация:**\n        - Администратор запускает UC-04 (Объединение информации) для обработки всех источников.\n- **Постусловие:** Единая инвентаризационная информация по всем доменам и сегментам сети.\n- **Исключения:**\n    1. Если учетная запись под которой запущен процесс не имеет административных прав на целевом компьютере, система выводит предупреждение и переходит к следующему компьютеру (NFR-04).\n    2. При пересекающихся именах компьютеров в разных доменах файлы вида `ComputerName.Тип.csv` перезаписываются последним выполненным сбором.\n    3. Для избежания коллизий рекомендуется использовать суффикс домена в имени компьютера при сборе.\n\n---\n\n**UC-06**: Асинхронный сбор с сетевых компьютеров.\n\n- **Актор:** Scheduled Task.\n- **Описание:** Локальный сбор с прямой записью в сетевой каталог для компьютеров, где удаленный сбор невозможен.\n- **Включает:** UC-INC-01, UC-INC-05. UC-INC-02 (если указан DayOld).\n- **Предусловие:** Созданы сетевые каталоги `\\\\fileserver\\inventory\\InvAnyComputers` (запись) и `\\\\fileserver\\inventory\\Src` (чтение), настроены права доступа для учетных записей компьютеров.\n- **Основной поток:**\n    1. Планировщик задач на целевом компьютере запускает командный файл `InvLocal.cmd` из сетевого каталога `\\\\fileserver\\inventory\\Src` от имени SYSTEM.\n    2. Выполняется PowerShell скрипт `InvLocal.ps1` с параметрами:\n        - `StartType = \"InvLocal\"`\n        - `InvFolderAnyComputers = \\\\fileserver\\inventory\\InvAnyComputers`\n        - `DayOld = 5`\n    3. Система выполняет UC-INC-01 (Проверка и подготовка инфраструктуры), проверяет доступность сетевых каталогов.\n    4. Система выполняет UC-INC-05 (Валидация типов собираемой информации), получая список типов информации.\n    5. Если указан параметр `DayOld`, система выполняет UC-INC-02 (Проверка актуальности информации) для данного компьютера.\n    6. Если требуется сбор (информация устарела или отсутствует):\n        - Для каждого типа информации из списка типов информации:\n            * Загружается соответствующий модуль из каталога `Get-Inventory-Module\\` (из сетевого каталога).\n            * Выполняется локальный сбор инвентаризационной информации.\n            * Результат сохраняется в файл формата `ИмяКомпьютера.КодТипа.csv` непосредственно в сетевой каталог `InvFolderAnyComputers`.\n- **Постусловие:** Инвентаризационная информация размещена в центральном хранилище и доступна для консолидации.\n- **Альтернативные потоки:**\n- **Исключения:**\n    1. Каталог `\\\\fileserver\\inventory\\Src` не существует или недоступен — задание планировщика не может быть выполнено.\n    2. Если компьютер не включен в домен, требуется предварительно проверить настройку доступа к каталогам `\\\\fileserver\\inventory\\InvAnyComputers` и `\\\\fileserver\\inventory\\Src`.\n\n\n### 7.3. Таблица включений (Include)\n\n| Основной сценарий (UC) | **UC-INC-01** (Проверка инфраструктуры) | **UC-INC-02** (Проверка актуальности информации) | **UC-INC-03** (Получение перечня компьютеров) | **UC-INC-04** (Проверка доступности) | **UC-INC-05** (Валидация типов собираемой информации) |\n| :--- | :---: | :---: | :---: | :---: | :---: |\n| **UC-01: Удаленный сбор со всего домена** | Да | Да* | Да | Да | Да |\n| **UC-02: Локальный сбор с автономного ПК** | Да | Да* | Нет | Нет | Да |\n| **UC-03: Выборочный сбор типов информации** | Да | Да* | Да | Да | Да |\n| **UC-04: Объединение инвентаризационной информации для анализа** | Да | Нет | Нет | Нет | Нет |\n| **UC-05: Гибридный сбор (разные сегменты)** | Да | Да* | Да** | Да |  Да |\n| **UC-06: Асинхронный сбор (сетевой ПК)** | Да | Да* | Нет | Нет | Да |\n\n**\\*** — Проверка актуальности выполняется **только если** указан параметр `DayOld` или `InvRemoteDayOld`.\u003cbr\u003e\n**\\*\\*** — Валидация источников выполняется для каждого домена или списка компьютеров.\n\n\n## 7.4. Таблица трассируемости требований\n\n| **ID требования** | **Наименование требования** | **Сценарий использования (Use Case)** |\n|:---|:---|:---|\n| **FR-01** | Управление сбором через единый интерфейс | UC-01, UC-02, UC-03, UC-04, UC-05, UC-06 |\n| **FR-02** | Локальный сбор инвентаризационной информации | UC-02, UC-06 |\n| **FR-02.1** | Упаковка инвентаризационной информации в ZIP-архив | UC-02 |\n| **FR-03** | Удаленный сбор инвентаризационной информации | UC-01, UC-03, UC-05 |\n| **FR-03.1** | Управление источниками сбора инвентаризационной информации | UC-01, UC-03, UC-05 |\n| **FR-03.1.1** | Получение списка из OU | UC-01, UC-05 |\n| **FR-03.1.2** | Перечисление имен компьютеров параметром | UC-03 |\n| **FR-03.1.3** | Чтение списка компьютеров из файла | UC-03 |\n| **FR-04** | Выбор типов собираемой информации | UC-03 |\n| **FR-04.1** | Интерактивный выбор типов через консоль | UC-03 |\n| **FR-04.2** | Указание конкретных типов | UC-03 |\n| **FR-05** | Консолидация и обработка инвентаризационной информации | UC-01, UC-04, UC-05 |\n| **FR-05.1** | Обработка ZIP архивов локального сбора | UC-04, UC-05 |\n| **FR-05.2** | Поддержка актуальности инвентаризационной информации | UC-01, UC-04, UC-05 |\n| **FR-06** | Расширяемость (добавление модулей) | UC-01, UC-02, UC-03, UC-06 |\n| **NFR-01** | Минимальное влияние на производительность | UC-01, UC-02, UC-03, UC-06 |\n| **NFR-02** | Проверка актуальности уже собранной инвентаризационной информации | UC-01, UC-02, UC-03, UC-06 |\n| **NFR-03** | Устойчивость к ошибкам на отдельных целевых компьютерах | UC-01, UC-02, UC-03, UC-06 |\n| **NFR-04** | Предварительная проверка наличия необходимых прав доступа | UC-01, UC-03, UC-05 |\n| **NFR-05** | Предварительная проверка доступности компьютеров в сети | UC-01, UC-03, UC-05 |\n| **NFR-06** | Автоматическая проверка и создание требуемых рабочих каталогов | UC-01, UC-02, UC-03, UC-04, UC-05, UC-06 |\n| **NFR-07** | Автоматическая самоконфигурация при определенных условиях | UC-01, UC-05 |\n| **NFR-08** | Ведение операционного лога | UC-01, UC-02, UC-03, UC-04, UC-05, UC-06 |\n| **NFR-08.1** | Ротация лог файлов процедур удаленного сбора и консолидации инвентаризационной информации | UC-01, UC-03, UC-04, UC-05 |\n| **NFR-08.2** | Ротация лог файлов локального сбора | UC-02, UC-06 |\n| **NFR-09** | Контроль доступа к информации | (Требование к инфраструктуре) |\n| **NFR-10** | Наличие встроенной справки |  (Не относится к UC) |\n| **NFR-11** | Портативность |  (Не относится к UC) |\n\n\n## 7.5. Трассировка пользовательских историй и сценариев использования\n\n| Пользовательская история | Сценарий использования | Вспомогательные сценарии |\n|:---|:---|:---|\n| **US-01:** Сбор со всего домена | **UC-01:** Удаленный сбор со всего домена | UC-INC-01, UC-INC-02, UC-INC-03, UC-INC-04 |\n| **US-02:** Автономный компьютер | **UC-02:** Локальный сбор с автономного ПК | UC-INC-01, UC-INC-02 |\n| **US-03:** Выборочный сбор | **UC-03:** Выборочный сбор типов | UC-INC-01, UC-INC-02, UC-INC-03, UC-INC-04 |\n| **US-04:** Объединение для анализа | **UC-04:** Объединение  | UC-INC-01, UC-INC-02 |\n| **US-05:** Разные методы сбора | **UC-05:** Гибридный сбор | UC-INC-01, UC-INC-02, UC-INC-03 |\n| **US-06:** Асинхронный сбор | **UC-06:** Асинхронный сбор | UC-INC-01, UC-INC-02 |\n\n## 7.6. BPMN-диаграмма процессов\n\n\u003cimg src=\"Docs/bpmn.png\" width=\"90%\"\u003e\n\n## 8. Спецификация и форматы\n\n### 8.1. Файловая структура системы\n\n```\nInventory/                         # Корневой каталог развертывания\n├── Docs/                          # Документация\n├── Src/                           # Исходный код\n│   ├── Results/                   # Результаты сбора инвентаризационной информации\n│   │   ├── InvAnyComputers/       # Инвентаризационная информация по компьютерам\n│   │   ├── InvResult/             # Итоговые файлы инвентаризационной информации\n│   │   └── Logs/                  # Логи выполнения сбора инвентаризационной информации\n│   ├── Report/                    # Отчеты\n│   │   ├── inv.xlsm               # Шаблон Excel\n│   │   └── inv.html.styles.css    # Стили HTML\n│   ├── Modules/                   # Модули командлета для сбора инвентаризационной информации\n│   │   ├── Get-Inventory-Module/  # Модули сбора инвентаризационной информации (FR-06)\n│   │   │   ├── dsk.ps1            # Логические диски (тип dsk)\n│   │   │   ├── evt.ps1            # События системы (тип evt)\n│   │   │   ├── gpu.ps1            # Графические адаптеры (тип gpu)\n│   │   │   ├── grp.ps1            # Состав локальных групп (тип grp)\n│   │   │   ├── hdd.ps1            # Физические диски (тип hdd)\n│   │   │   ├── hfx.ps1            # Установленные обновления ОС (тип hfx)\n│   │   │   ├── hwr.ps1            # Аппаратная конфигурация (тип hwr)\n│   │   │   ├── map.ps1            # Подключенные сетевые диски (тип map)\n│   │   │   ├── mnt.ps1            # Информация о подключенных мониторах (тип mnt)\n│   │   │   ├── net.ps1            # Сетевые интерфейсы (тип net)\n│   │   │   ├── pci.ps1            # PCI устройства (тип pci)\n│   │   │   ├── prf.ps1            # Профили пользователей (тип prf)\n│   │   │   ├── ram.ps1            # Модули памяти (тип ram)\n│   │   │   ├── shr.ps1            # Общие ресурсы (тип shr)\n│   │   │   ├── svc.ps1            # Службы ОС (тип svc)\n│   │   │   ├── swr.ps1            # Установленное ПО (тип swr)\n│   │   │   ├── tsk.ps1            # Задания планировщика (тип tsk)\n│   │   │   ├── usr.ps1            # Локальные пользователи (тип usr)\n│   │   │   └── reg.ps1            # Значения параметров реестра (тип reg)\n│   |   ├── Get-Inventory.ps1      # Основной командлет сбора инвентаризационной информации\n│   |   ├── CheckFolder.ps1        # Проверка используемых каталогов\n│   |   ├── CheckLogFile.ps1       # Проверка возможности ведения файла протокола\n│   |   ├── CheckOU.ps1            # Проверка параметра InvOU (OU AD)\n│   |   ├── CreateResult.ps1       # Формирование итоговых файлов с результатами инвентаризации\n│   |   ├── DeleteOld.ps1          # Удаление старых файлов инвентаризации\n│   |   ├── Get-Computer.ps1       # Получение перечня компьютеров в домене\n│   |   ├── Get-FolderAccess.ps1   # Получение разрешений NTFS для каталога, включая вложенные каталоги\n│   |   ├── InvLocal.ps1           # Локальный сбор инвентаризации\n│   |   ├── InvType.ps1            # Формирование справочника типов инветаризации\n│   |   ├── ListComputers.ps1      # Получения перечня компьютеров с которых будет выполнен сбор\n│   |   ├── PollComputers.ps1      # Удаленный сбор инвентаризации\n│   |   ├── SelectInvType.ps1      # Выбор типов собираемой информатизации\n│   |   ├── UnZIP.ps1              # Распаковка ZIP архивов с файлами инвентаризации\n│   |   ├── WriteLog.ps1           # Запись в лог файл\n│   ├── InvLocal.cmd               # Командный файл запуска InvLocal.ps1\n│   ├── InvLocal.ps1               # Скрипт-обертка для локального сбора\n│   ├── InvRemote.ps1              # Скрипт-обертка для удаленного сбора\n│   ├── InvWork.ps1                # Скрипт-обертка для обработки\n│   ├── Start-Inventory.psm1       # Главный командлет (FR-01)\n│   └── Start-Inventory.psd1       # Манифест модуля\n```\n\n### 8.2. Спецификация типов собираемой информации\nСистема включает 19 модулей сбора. Каждый модуль представляет собой скрипт PowerShell (`.ps1`) в каталоге `Src\\Get-Inventory-Module\\` и отвечает за сбор одного типа информации.\n\n| Код | Наименование типа | Файл модуля | Краткое описание (Источник информации) |\n| :--- | :--- | :--- | :--- |\n| **hwr** | Аппаратная конфигурация | `hwr.ps1` | Сводные информация о системе: модель, ОС, процессор, память, сеть. Источники: WMI (`Win32_ComputerSystem`, `Win32_Processor`), реестр. |\n| **swr** | Установленное ПО | `swr.ps1` | Перечень установленных программ. Источник: реестр. |\n| **net** | Сетевые адаптеры | `net.ps1` | Активные сетевые интерфейсы и их конфигурация (IP, MAC, DHCP). Источник: WMI (`Win32_NetworkAdapterConfiguration`). |\n| **dsk** | Логические диски | `dsk.ps1` | Логические разделы, файловые системы, размер и свободное место. Источник: WMI (`Win32_LogicalDisk`). |\n| **hdd** | Физические диски | `hdd.ps1` | Физические накопители (HDD, SSD): модель, размер, интерфейс. Источник: WMI (`Win32_DiskDrive`). |\n| **ram** | Оперативная память | `ram.ps1` | Модули ОЗУ: размер, тип, расположение. Источник: WMI (`Win32_PhysicalMemory`). |\n| **svc** | Службы Windows | `svc.ps1` | Состояние, тип запуска и учетная запись служб. Источник: WMI (`Win32_Service`). |\n| **hfx** | Обновления ОС (Hotfix) | `hfx.ps1` | Установленные обновления Windows. Источник: WMI (`Win32_QuickFixEngineering`). |\n| **usr** | Локальные пользователи | `usr.ps1` | Учетные записи локальных пользователей. Источник: WMI (`Win32_UserAccount`). |\n| **grp** | Состав локальных групп | `grp.ps1` | Членство в локальных группах. Источник: WMI (`Win32_GroupUser`). |\n| **prf** | Профили пользователей | `prf.ps1` | Информация о загруженных профилях. Источник: реестр (`HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList`). |\n| **shr** | Общие сетевые ресурсы | `shr.ps1` | Общие папки и их разрешения (NTFS/SMB). Источник: WMI (`Win32_Share`). |\n| **map** | Подключенные сетевые диски | `map.ps1` | Сопоставленные сетевые диски. Источник: реестр (`HKCU\\Network`). |\n| **tsk** | Задания планировщика | `tsk.ps1` | Задания из Планировщика Windows. Источник: COM-объект `Schedule.Service`. |\n| **gpu** | Графические адаптеры | `gpu.ps1` | Видеокарты и их память. Источник: WMI (`Win32_VideoController`). |\n| **mnt** | Мониторы | `mnt.ps1` | Подключенные мониторы. Источник: WMI (`Win32_DesktopMonitor`). |\n| **pci** | PCI устройства | `pci.ps1` | Устройства на шине PCI. Источник: WMI (`Win32_PnPEntity`). |\n| **reg** | Значения реестра | `reg.ps1` | Значения заданных параметров реестра. Источник: реестр. |\n| **evt** | События включения/выключения | `evt.ps1` | События загрузки и выключения из журнала System. Источник: `Get-WinEvent`. |\n\n---\n\n### 8.3. Соглашения о форматах имен файлов инвентаризационной информации\n\n#### 8.3.1. Файлы инвентаризационной информации по отдельным компьютерам\nМестоположение: Каталог `InvFolderAnyComputers`  \nФормат имени: `MMMM.TTT.csv`  \n  - `MMMM` - имя компьютера (NetBIOS имя), например: `SRV01`, `PC-USER01`.\n  - `TTT` - трехсимвольный код типа инвентаризационной информации, например: `hwr`, `swr`, `net`.\n  - Расширение файла: `.csv`\n\nПримеры имен файлов:\n  - `SRV01.hwr.csv` - инвентаризационная информация аппаратной конфигурации компьютера SRV01.\n  - `PC-USER01.swr.csv` - инвентаризационная информация установленного ПО компьютера PC-USER01.\n  - `WS01.net.csv` - инвентаризационная информация сетевых интерфейсов компьютера WS01.\n\n\n#### 8.3.2. Итоговые результирующие файлы инвентаризационной информации\nМестоположение: Каталог `InvFolderResult`  \nФормат имени: `TTT.csv`  \n  - `TTT` - трехсимвольный код типа инвентаризационной информации.\n  - Расширение файла: `.csv`\n\nПримеры имен файлов:\n  - `hwr.csv` - консолидированная инвентаризационная информация аппаратной конфигурации всех компьютеров.\n  - `swr.csv` - консолидированная инвентаризационная информация установленного ПО всех компьютеров.\n  - `net.csv` - консолидированная инвентаризационная информация сетевых интерфейсов всех компьютеров.\n\n\n#### 8.3.3. Файлы логов удаленного сбора и обработки инвентаризационной информации\nМестоположение: Каталог `InvFolderLog`  \nФормат имени: `Inv_YYYY-MM-DD.log`  \n  - `YYYY` - год (4 цифры)\n  - `MM` - месяц (2 цифры)\n  - `DD` - день (2 цифры)\n  - Расширение файла: `.log`\n\nПримеры имен файлов:\n  - `Inv_2025-10-15.log` - лог сбора от 15 октября 2025 года.\n  - `Inv_2025-10-16.log` - лог сбора  от 16 октября 2025 года.\n\n\n#### 8.3.4. Файлы логов локального сбора инвентаризационной информации\nМестоположение: Каталог `InvFolderLog`  \nФормат имени: `Inv_MMMM.log`  \n  - `MMMM` - имя компьютера (NetBIOS имя), например: `SRV01`, `PC-USER01`\n  - Расширение файла: `.log`\n\nПримеры имен файлов:\n  - `Inv_SRV01.log` - лог сбора компьютера SRV01.\n  - `Inv_PC-USER01.log` - лог сбора компьютера PC-USER01.\n\nАвтоматическая ротация:  \n  - Для удаленного сбора и обработки информации: Создание нового файла ежедневно, удаление старых файлов (храниться 20 последних файлов). \n  - Для локального сбора: Файл создается для компьютера, при достижение размера 20кБ, файл пересоздается.\n\n\n#### 8.3.5. ZIP-архивы автономной инвентаризационной информации\nМестоположение: Каталог `InvFolderZIPFiles`  \nФормат имени: `inv.MMMM.zip`  \n  - `MMMM` - имя компьютера\n\nПримеры имен файлов:\n  - `inv.PC01.zip` - архив инвентаризационной информации от компьютера PC01.\n  - `inv.LAPTOP05.zip` - архив инвентаризационной информации от компьютера LAPTOP05.\n\n---\n\n### 8.4. Форматы файлов инвентаризационной информации\n  - **Инвентаризационная информация**: CSV с кодировкой UTF-8, разделитель - запятая.\n  - **Логи сбора инвентаризационной информации**: CSV с кодировкой UTF-8, разделитель - точка с запятой.\n\n---\n\n### 8.5. Критерии качества информации\n  - **Консистентность:** Все файлы одного типа (`hwr.csv`, `swr.csv` и т.д.) должны иметь идентичный набор столбцов (схему) для всех версий системы.\n  - **Целостность:** Обязательные поля не должны быть пустыми.\n  - **Уникальность:**\n    * Для каждого типа инвентаризационной информации должен существовать только один соответствующий файл содержащий информацию одного типа.\n    * В файле с одним типом информации по конкретному компьютеру содержится вся полученная информация от соответствующего модуля сбора.\n    * Уникальность возвращаемых информации обеспечивается на стороне модуля сбора.\n\n\n## 9. Требования к интерфейсу командлета\n\n### 9.1. Общее описание командлета\n\n**Командлет:** `Start-Inventory`.  \n**Модуль:** `Start-Inventory.psm1`.  \n**Расположение:** `Inventory\\Src\\Start-Inventory.psm1`.  \n**Зависимости:** PowerShell 3.0+, модуль ActiveDirectory (для работы с AD).  \n**Назначение:** Основной управляющий командлет системы, обеспечивающий запуск всех сценариев сбора, обработки и консолидации инвентаризационной информации.  \n**Принцип работы:** Командлет выступает в качестве фасада, инкапсулируя сложную логику взаимодействия с модулями сбора, Active Directory и файловой системой за простым интерфейсом.\n\n---\n\n### 9.2. Таблица параметров командлета\n\n| Параметр | Тип | Значение по умолчанию | Допустимые значения | Описание |\n|----------|-----|-----------------------|----------------------|-----------|\n| \u003cnobr\u003e-StartType | [String] | \"InvRemoteCreateResult\" | \"InvRemote\", \"InvLocal\", \"CreateResult\", \"InvRemoteCreateResult\" | Основной режим работы системы. Определяет тип выполняемой операции. |\n| \u003cnobr\u003e-SelectInvType | [String[]] | Все доступные типы (если параметр не указан) | Массив из трехсимвольных кодов: `\"hwr\"`, `\"swr\"`, `\"net\"`, `\"dsk\"`, `\"hdd\"`, `\"ram\"`, `\"svc\"`, `\"hfx\"`, `\"usr\"`, `\"grp\"`, `\"prf\"`, `\"shr\"`, `\"map\"`, `\"tsk\"`, `\"gpu\"`, `\"mnt\"`, `\"pci\"`, `\"reg\"`, `\"evt\"`. Специальное значение `\"select\"` | Выбор типов инвентаризационной информации для сбора. Специальное значение `\"select\"` - интерактивный выбор. |\n| \u003cnobr\u003e-InvComputerList | [String] | $null | 1) Список имен через запятую\u003cbr\u003e2) \"file:путь_к_файлу.csv\"| Источник списка компьютеров для сбора. Префикс `\"file:\"` указывает на CSV-файл со списком (заголовок в файле `ComputerName`). |\n| \u003cnobr\u003e-InvOU | [String] | $null | DistinguishedName OU в Active Directory (например, \"OU=Workstations,DC=company,DC=local\") | Организационное подразделение Active Directory, из которого получается список компьютеров. |\n| \u003cnobr\u003e-InvFolderAnyComputers | [String] | \".\\InvAnyComputers\\\" | Локальный или UNC-путь к каталогу | Каталог для хранения информации по отдельным компьютерам (файлы `ИмяПК.ТТТ.csv`). |\n| \u003cnobr\u003e-InvFolderResult | [String] | \".\\InvResult\\\" | Локальный или UNC-путь к каталогу | Каталог для консолидированных результатов (файлы `ТТТ.csv`). |\n| \u003cnobr\u003e-InvFolderLog | [String] |  | Локальный или UNC-путь к каталогу | Каталог для логов выполнения. |\n| \u003cnobr\u003e-InvFolderZIPFiles | [String] |  | Локальный или UNC-путь к каталогу | Каталог для ZIP-архивов от автономных компьютеров. Проверка актуальности информации при локальном сборе.|\n| \u003cnobr\u003e-DayOld | [Int32] | 30 | Целое число ≥ 0 | Максимальный возраст файлов (в днях):\u003cbr\u003eпри локальном сборе – для пропуска сбора, если информация не старше N дней;\u003cbr\u003eпри удаленном сборе - при получении списка компьютеров из OU (компьютеры активные в течении N дней);\u003cbr\u003eпри  консолидации – для удаления файлов в `InvFolderAnyComputers` старше N дней. |\n| \u003cnobr\u003e-InvRemoteDayOld | [Int32] | 0 | Целое число ≥ 0 | Проверка актуальности информации при удаленном сборе. Если информация младше указанного значения, сбор пропускается. 0 = не проверять. |\n| \u003cnobr\u003e-ExtendLog | [Boolean] | $false | $true, $false | Включение расширенного логирования. Добавляет детальную информацию о выполнении каждого модуля. |\n| \u003cnobr\u003e-ModuleParameters | [Hashtable[]] | @() | Массив хэш-таблиц:\u003cbr\u003e `@{Module=\"код\"; VarName=\"Имя переменной в модуле\"; VarValue=\"Значение переменой\"}` | Дополнительные параметры для модулей сбора. Позволяет тонкую настройку отдельных модулей. |\n\n---\n\n### 9.3. Детализация значений параметра StartType\n\n#### 9.3.1. `StartType = \"InvRemote\"`\n**Назначение:** Удаленный сбор инвентаризационной информации с указанных компьютеров  \n**Требования:**\n- Доступ к Active Directory (при использовании `-InvOU`)\n- Запущенная служба WinRM на целевых компьютерах\n- Административные права на целевых компьютерах\n\n**Поведение:**\n1. Получение списка компьютеров (из `-Inv","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpavelnovgorodov%2Finventory","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpavelnovgorodov%2Finventory","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpavelnovgorodov%2Finventory/lists"}