Вопрос или проблема
На Windows 10 приведённая ниже команда работает идеально:
netsh mbn show read interface = *
Эта команда отображает детали текущей SIM-карты в планшетах; состояние, аварийный режим (включен или выключен), идентификатор подписчика, ICC идентификатор SIM и количество телефонных номеров.
В целях этого вопроса предположим, что всегда присутствует только 1 SIM-карта и никогда больше — я не уверен, приведёт ли установка нескольких SIM-карт к тому, что будут перечислены детали всех SIM.
Нам необходимо знать только ICC идентификатор SIM.
Вышеуказанная команда была протестирована на нескольких планшетах Lenovo D330 и Lenovo Duet i3 с Windows 10, и она работает безупречно — с некоторыми дополнительными параметрами ICC идентификатор может быть извлечён автоматически, что нам и нужно сделать.
Однако на тех же моделях планшетов, работающих на Windows 11, результат этой команды таков:
Не удалось получить доступ к интерфейсу: ошибка 0x32.
Каждое устройство, работающие на Windows 11, выдает ту же ошибку.
Есть ли причина, по которой эта команда не работает на Windows 11? Или, возможно, настройка, которую я пропустил и которую нужно включить/выключить, чтобы она работала?
Существует ли альтернативный способ получить ICC идентификатор через командную строку?
Драйвер LTE переустановлен дважды, опция Cellular определенно включена, SIM-карта определенно присутствует и функционирует, все детали, которые я ищу, можно найти в Настройки > Сеть & Интернет > Мобильная сеть > Настройки оператора > Свойства; просто эта команда не показывает те же результаты на Win11, как на Win10.
Конечная цель — иметь возможность получать ICC идентификатор из приложения C#, именно поэтому это должно быть через командную строку, а не через интерфейс Windows.
Не знаю, почему я не подумал об этом раньше, но я, похоже, могу получить именно то, что мне нужно из реестра. Я использовал функцию “Поиск” в редакторе реестра и искал ICC SIM, который я получил из интерфейса Windows. После нескольких потенциальных ключей я наткнулся на один, который, похоже, перечисляет только ICC идентификатор текущей SIM-карты.
В Computer\HKLM\SOFTWARE\Microsoft\Multivariant\UI\Candidates\UICC\
есть единственный подкласс, названный по имени ICC SIM. Я могу прочитать ключ Candidates и получить подклассы, что возвращает имя одного присутствующего подкласса, и это ICC SIM. Если я заменю SIM-карту на другую и выполню ту же функцию, я получаю ICC новой SIM-карты и никаких других подклассов, показывая, что старая запись была удалена / переименована.
Теперь протестировано на планшетах Win10 и Win11 и работает на обоих.
Мне было бы очень интересно узнать, почему команда NETSH
возвращает ошибку.
Ответ или решение
Получение ICC ID SIM-карты через командную строку в Windows 11
Введение
Пользователи Windows 10 успешно использовали команду netsh mbn show read interface=*
для получения данных о SIM-картах, включая ICC ID, однако эта команда выдает ошибку в Windows 11. В данном ответе мы проанализируем причины данной проблемы и предложим альтернативные методы извлечения ICC ID для более эффективного решения вашей задачи.
Причины ошибки
Ошибки, подобные "Failed to access the interface: error 0x32", возникают по различным причинам. Одна из возможных причин заключается в изменении архитектуры взаимодействия с сетевыми интерфейсами в Windows 11. Майкрософт может ограничить доступ к определенным функциям командной строки для улучшения безопасности и интеграции с новыми системами. Особенно если учесть, что Windows 11 акцентирует внимание на облачных технологиях и пользовательском опыте.
Также возможен сбой в драйверах или их несовместимость с новым операционным окружением. Убедитесь, что вы используете самые последние версии драйверов для LTE и обновления системы.
Альтернативные методы получения ICC ID
Если команда netsh
не работает, вы можете использовать другой способ — извлечение данных из реестра Windows. Это может служить надежным методом для получения ICC ID, поскольку он не зависит от состояния сетевых интерфейсов.
Шаги для получения ICC ID из реестра:
-
Открытие редактора реестра:
- Нажмите
Win + R
, введитеregedit
и нажмитеEnter
.
- Нажмите
-
Навигация к соответствующему ключу:
- Перейдите к следующему пути в реестре:
Computer\HKLM\SOFTWARE\Microsoft\Multivariant\UI\Candidates\UICC\
- Перейдите к следующему пути в реестре:
-
Поиск ICC ID:
- В данной ветке будет подкаталог, названный по ICC ID вашей SIM-карты. Вы можете просмотреть содержимое этого ключа и получить необходимую информацию.
-
Автоматизация процесса с помощью командной строки:
- Вы можете воспользоваться командой
reg query
для получения ICC ID через командную строку. Например:reg query "HKLM\SOFTWARE\Microsoft\Multivariant\UI\Candidates\UICC"
- Вы можете воспользоваться командой
Пример C# приложения
Теперь, когда вы знаете, как получить ICC ID через реестр, можно интегрировать этот процесс в ваше C# приложение. Вот пример кода, который делает это:
using Microsoft.Win32;
public static string GetSimIccId()
{
string iccId = string.Empty;
try
{
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Multivariant\UI\Candidates\UICC"))
{
if (key != null)
{
string[] subKeyNames = key.GetSubKeyNames();
if (subKeyNames.Length > 0)
{
iccId = subKeyNames[0]; // ICC ID - это имя подкаталога
}
}
}
}
catch (Exception ex)
{
// Обработка ошибок
Console.WriteLine($"Ошибка: {ex.Message}");
}
return iccId;
}
Заключение
Хотя использование команды netsh mbn
в Windows 10 дало доступ к ICC ID, изменения в Windows 11 требуют адаптации подходов к извлечению данных. Использование реестра предоставляет надежное решение, работающее как на Windows 10, так и на Windows 11. Убедитесь, что вы работаете с обновленными драйверами и операционной системой для минимизации возможных конфликтов.
Данный метод не только упрощает процесс, но и интегрируется непосредственно в приложение на C#, что делает его идеальным решением для вашей задачи. Если у вас есть дополнительные вопросы или требуется помощь, не стесняйтесь обращаться!