Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
105 / 18 / 7
Регистрация: 24.09.2020
Сообщений: 109

Powershell Net.IPAddress

23.12.2020, 18:38. Показов 2023. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени.

Подскажите, как в переменной типа Net.IPAddress увидеть значение свойства Address?
Вызов Address ничего не даёт:
PowerShell
1
2
3
4
5
PS D:\Scripts> $CurrentIP = Get-NetIPAddress -AddressFamily IPv4 -InterfaceAlias Ethernet
 
PS D:\Scripts> $CurrentIP.Address
 
PS D:\Scripts>
Но если задавать значение переменной вручную, свойство Address заполняется:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PS D:\Scripts> [Net.IPAddress]$otherIP = "10.128.214.11"
 
PS D:\Scripts> $otherIP.Address
 
198606858
PS D:\Scripts> $CurrentIP.Address -band $otherip.Address
 
Заданное приведение является недопустимым.
строка:1 знак:1
+ $CurrentIP.Address -band $otherip.Address
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], InvalidCastException
    + FullyQualifiedErrorId : System.InvalidCastException
 
PS D:\Scripts>
Вместе с тем, такая функция отрабатывает корректно:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PS D:\Scripts> Function Test-Subnet
{
    param (
         [parameter(Mandatory=$true)]
         [Net.IPAddress]
         $IP,
         [parameter(Mandatory=$true)]
         [Net.IPAddress]
         $SubnetIP,
         [parameter(Mandatory=$true)]
         [Net.IPAddress]
         $SubnetMask
    )
    ($IP.address -band $SubnetMask.address) -eq ($SubnetIP.address -band $SubnetMask.address)
}
 
Test-Subnet -IP 10.128.218.155 -SubnetIP 10.128.218.1 -SubnetMask 255.255.255.0
True
PS D:\Scripts>
Не понимаю как так.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.12.2020, 18:38
Ответы с готовыми решениями:

PowerShell vs PowerShell ISE
Скажите, пожалуйста, чем PowerShell отличается от PowerShell ISE. Спасибо.

PowerShell
Надо привести пример использования командлета Disable-WSManCredSSP в PowerShell. Ввожу команду Disable-WSManCredSSP -Role Client и...

Powershell и AD
Доброго времени суток! Первый раз в жизни взялся за Powershell и столкнулся со следующей задачей: 1. Спрашивает у администратора...

11
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
23.12.2020, 19:06
Цитата Сообщение от Wizard333 Посмотреть сообщение
$CurrentIP = Get-NetIPAddress -AddressFamily IPv4 -InterfaceAlias Ethernet
PowerShell
1
2
$CurrentIP|gm
$CurrentIP|fl *
Смотрим и видим, что там есть:
PowerShell
1
$CurrentIP.ipaddress
или
PowerShell
1
$CurrentIP.ipv4address
0
105 / 18 / 7
Регистрация: 24.09.2020
Сообщений: 109
23.12.2020, 20:55  [ТС]
YuS_2, нет, вопрос именно про свойство Address
Такое свойство у данного типа есть, и при каких-то обстоятельствах оно имеет значение, а при каких-то нет или не отображается(???)
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
23.12.2020, 22:00
Wizard333, значения берутся из реестра (в конечном счёте). Вроде бы в дистр pwsh входит sos.dll, можно глянуть в WinDbg что там за шаманста со свойством происходят.
0
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
23.12.2020, 23:08
Цитата Сообщение от Wizard333 Посмотреть сообщение
вопрос именно про свойство Address
Такое свойство у данного типа есть
PowerShell
1
2
 > (Get-NetIPAddress | Get-Member).TypeName[0]
Microsoft.Management.Infrastructure.CimInstance#ROOT/StandardCimv2/MSFT_NetIPAddress
The MSFT_NetIPAddress class has these properties.

Address

Data type: string

Access type: Read-only

Qualifiers: Deprecated ("CIM_IPProtocolEndpoint.IPv4Address" , "CIM_IPProtocolEndpoint.IPv6Address" )

The IP address that this protocol endpoint represents, formatted according to the appropriate convention as defined in the AddressType property of this class (e.g., 171.79.6.40). This single property is deprecated to replace it by specific IPv4 and v6 addresses.
Это свойство устарело.
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
23.12.2020, 23:11
Устаревшее свойство не является показателем странного поведения (просто корректность возвращаемых данных не гарантируется, это как с WinAPI, например, GetVersion - вроде бы есть, но использовать её не рекомендуется).
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
24.12.2020, 08:00
Цитата Сообщение от Wizard333 Посмотреть сообщение
Такое свойство у данного типа есть, и при каких-то обстоятельствах оно имеет значение, а при каких-то нет или не отображается
Вы функцию разберите по частям, посмотрите, что передаёте ей в качестве параметров и станет всё понятно...
Например:
передаются параметры:
Цитата Сообщение от Wizard333 Посмотреть сообщение
PowerShell
1
Test-Subnet -IP 10.128.218.155 -SubnetIP 10.128.218.1 -SubnetMask 255.255.255.0
Функция пытается сравнивать:
Цитата Сообщение от Wizard333 Посмотреть сообщение
($IP.address -band $SubnetMask.address) -eq ($SubnetIP.address -band $SubnetMask.address)
Но откуда бы взяться свойству $IP.address и $SubnetMask.address в соответствующих переменных? Вот она и отрабатывает неизвестно что...
Запустите без функции, прямо в консоли:
PowerShell
1
($IP.address -band $SubnetMask.address) -eq ($SubnetIP.address -band $SubnetMask.address)
что получается?
и никаких исключений...
По сути, в функции выполняется это (пример одной переменной):
PowerShell
1
[Net.IPAddress]$SubnetIP =  10.128.218.1
опять же, посмотрите, что получается в итоге:
PowerShell
1
$SubnetIP|gm
...
В общем, сформулируйте вопрос, что именно непонятно и в какой части... подумаем-почитаем документацию и всё станет на свои места...

Цитата Сообщение от greg zakharov Посмотреть сообщение
Устаревшее свойство не является показателем странного поведения
Совершенно верно. Но тут вопрос в том, где именно подразумевается странное поведение... я лично, пока не понял...
1
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
24.12.2020, 08:21
Цитата Сообщение от greg zakharov Посмотреть сообщение
Устаревшее свойство не является показателем странного поведения
А что странного в том, что это свойство вообще ничего не возвращает. Речь только про Get-NetIPAddress и про объект (MSFT_NetIPAddress), который этот комадлет возвращает. К тому же это свойство имеет тип String, а не Net.IPAddress.
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
24.12.2020, 08:32
PS C:\Users\alHaos> [System.Net.IPAddress]$CurrentIP = Get-NetIPAddress -AddressFamily IPv4 -InterfaceAlias Ethernet
MetadataError: Cannot convert the "MSFT_NetIPAddress (Name = ";@C8???8;AB8;A?55;:55;55;", CreationClassName = "", SystemCreationClassName = "", SystemName = "")" value of type "Microsoft.Management.Infrastructure.Cim Instance#ROOT/StandardCimv2/MSFT_NetIPAddress" to type "System.Net.IPAddress".

тип возвращаемого значения Get-NetIPAddress не [IPAddress]
1
105 / 18 / 7
Регистрация: 24.09.2020
Сообщений: 109
24.12.2020, 12:29  [ТС]
С вашей помощью разобрался.
Действительно суть в том, что тип возвращаемых Get-NetIPAddress НЕ Net.IpAddress
PowerShell
1
2
3
4
5
6
7
PS D:\Scripts> $CurrentIP = Get-NetIPAddress -AddressFamily IPv4 -InterfaceAlias Ethernet
PS D:\Scripts> $CurrentIP.Address
PS D:\Scripts> $CurrentIP.gettype()
 
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     CimInstance                              System.Object
А функция работает потому что в качестве аргумента я передаю ей свойство IPAddress, которое приводится к Net.IPAddress, и у неё уже формируется свойство Address:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
PS D:\Scripts> $NetIP = [Net.IPAddress]$CurrentIP.IPAddress
PS D:\Scripts> $NetIP
 
Address            : 198606858
AddressFamily      : InterNetwork
ScopeId            :
IsIPv6Multicast    : False
IsIPv6LinkLocal    : False
IsIPv6SiteLocal    : False
IsIPv6Teredo       : False
IsIPv4MappedToIPv6 : False
IPAddressToString  : 10.128.214.11
 
PS D:\Scripts> $NetIP.gettype()
 
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     IPAddress                                System.Object
 
PS D:\Scripts> ($CurrentIP.address -band $SubnetMask.address) -eq ($SubnetIP.address -band $SubnetMask.address)
Заданное приведение является недопустимым.
строка:1 знак:1
+ ($CurrentIP.address -band $SubnetMask.address) -eq ($SubnetIP.address ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], InvalidCastException
    + FullyQualifiedErrorId : System.InvalidCastException
 
PS D:\Scripts> ($NetIP.address -band $SubnetMask.address) -eq ($SubnetIP.address -band $SubnetMask.address)
False
Добавлено через 4 минуты
Остаётся вопрос в устаревании свойства Address - допустимо ли использовать его в работе? И если нет то какое свойство использовать для функции проверки вхождения IP-адреса в определенную подсеть?
0
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
24.12.2020, 15:12
Цитата Сообщение от Wizard333 Посмотреть сообщение
Остаётся вопрос в устаревании свойства Address - допустимо ли использовать его в работе?
Для типа MSFT_NetIPAddress конечно недопустимо. А для IpAddress оно не устарело. Это разные типы, хоть и имеют созвучные свойства.
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
24.12.2020, 15:39
Цитата Сообщение от lesser
А что странного в том, что это свойство вообще ничего не возвращает.
Это вопрос, утверждение или простое повествовательное с сентенцией вопросительного? Строго говоря, кривизна проектировки WMI такова, что свойства некоторых объектов и вовсе могут не отображаться или отображаться, но неверно.
Цитата Сообщение от lesser
Речь только про Get-NetIPAddress и про объект (MSFT_NetIPAddress), который этот комадлет возвращает.
Технически, командлет не возвращает объект WMI (так как сам является объектом, наследующим некоторым другим объектам), - извлекаются свойства класса. Иначе говоря это - высокоуровневая надстройка над другой высокоуровневой надстройкой (и далее по нисходящей).
Цитата Сообщение от lesser
К тому же это свойство имеет тип String, а не Net.IPAddress.
Спасибо, кэп, без вас об этом бы никто так и не узнал бы.
Цитата Сообщение от Wizard333
И если нет то какое свойство использовать для функции проверки вхождения IP-адреса в определенную подсеть?
Лучше создать собственную функцию либо берущую данные из реестра, либо использовать системный API. По крайней мере если это обернуть всё в пользовательский модуль, и потом случись какая оказия, вам будет известно где искать ошибку.
Цитата Сообщение от YuS_2
Но тут вопрос в том, где именно подразумевается странное поведение...
Странного поведения в pwsh достаточно, всего так и не вспомнишь сходу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.12.2020, 15:39
Помогаю со студенческими работами здесь

Не запускается PowerShell
Выдает ошибку при запуске: Windows PowerShell завершена из-за следующей ошибки: Инициализатор типа...

Powershell + AutoIT
Коллеги, подскажите, как интегрировать команды AutoIT (функция send для эмуляции нажатия клавиш) в скрипт на Powershell?

Скрипт PowerShell
Уважаемые знатоки PowerShell нужна помощь по заданию такого рода: Разработать PowerShell скрипт, который cчитает периметр многоугольника,...

Введение в PowerShell
PowerShell Windows PowerShell — это новая оболочка командной строки на основе задач и язык сценариев. Она специально разработана для...

Powershell - инвентаризация
Господа, всем привет! Задача была написать скрипт инвентаризации компьютеров по сети, скрипт есть но работает стабильно через раз, нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru