Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Автоматизация изменения данных авторизации на устройстве (http://forum.oszone.net/showthread.php?t=339116)

Armsinglom 08-02-2019 11:05 2856833

Автоматизация изменения данных авторизации на устройстве
 
Вложений: 2
Добрый день.
Господа, подскажите пожалуйста, каким способом можно решить такую задачу:
1) Есть большая куча устройств с возможностью подключения к ним через web морду, данные устройства имеют авторизацию (login/password)(см. auth.jpg).
2) Данное устройство имеет несколько учетных записей. (admin/service/ и т.д.) (см. user.jpg)
3) Изменения пароля для всех учетных записей можно сделать только под учетной записью admin.
Задача:
Необходимо изменить стандартный пароль для нескольких учетных записей, причем на большей половине устройств пароли уже изменены и трогать их не нужно.

Как я вижу в общих чертах решение:
Подключаемся к устройству, пытаемся авторизоваться под стандартным логином и паролем, если авторизация успешна то меняем пароль для учетных записи. Так же нужно учитывать что предварительно пароли уже нагенерированы для каждого IP устройства и лежать в файлике...

Armsinglom 10-02-2019 11:31 2857094

Попробовал это сделать так, но столкнулся с несколькими проблемами:
Код:

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
objIE.Navigate "10.37.167.114/chgpassw.htm"
While objIE.Busy
    WScript.Sleep 200
Wend
Set objForm = objIE.Document.forms("frm")
objForm.elements("user_no").value = "130"
objForm.submit()
WScript.Sleep 200
objForm.elements("oldpassw").value = "password"
objForm.elements("newpassw1").value = "Password"
objForm.elements("newpassw2").value = "Password"
objIE.Visible = True

1) Не получается обойти проблему с авторизацией на устройстве. (приходится руками вводить логин и пароль)
2) Страница изменения пароля открывается, выбирается учетная запись на которой необходимо поменять логин и пароль, но поля oldpassw/newpassw1/newpassw2 не заполняются.
Так же хорошо бы что бы скрипт работал со списком IP адресов, логинов, и паролей, ну и был какой то обработчик ошибок.

Armsinglom 11-02-2019 09:50 2857281

Ребят совсем нет идей? Так же скажу, что когда то давно это реализовывали на питоне, но теперь из за безопасной безопасности остались варианты только vbs, js, powershell. Можно с помощью этих инструментов решить задачу?

Armsinglom 11-02-2019 10:09 2857284

Авторизацию IE удалось обойти через chrome, http://admin:password@10.37.166.114/chgpassw.htm(в IE данный способ авторизации не работает), но непонятно как через chrome работать с элементами....

Armsinglom 11-02-2019 11:06 2857291

Решил проблему с авторизацией IE:
Создал записи в реестре DWORD с именами iexplore.exe и explorer.exe values = 0.

для текущего юзера:
HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
Если необходимо для всех юзеров то вот:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE

Теперь IE понимает адрес такого формата: http://admin:password@10.37.166.114/chgpassw.htm ,авторизация теперь не выскакивает...

Осталось:
1) Научить скрипт брать логин, пароль и IP из файлика.
2) Осталась нерешенная проблема с заполнением полей oldpassw/newpassw1/newpassw2. (выбор юзера на котором будет меняться пароль выбирается корректно.)
3) обработка ошибок.

Armsinglom 11-02-2019 15:08 2857319

Все удалось оживить скрипт, пароль на устройстве изменился!
Код:

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
objIE.Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
While objIE.Busy
    WScript.Sleep 200
Wend
Set objForm = objIE.Document.forms("frm")
objForm.elements("user_no").value = "130"
objForm.submit()
WScript.Sleep 600
Set objForm = objIE.Document.forms("frm")
objForm.elements("oldpassw").value = "password"
objForm.elements("newpassw1").value = "Passwordnew"
objForm.elements("newpassw2").value = "Passwordnew"
objIE.Visible = True

Помогите заставить этот скрипт брать логин, пароль, IP из файла для заполнения данной формы
Код:

objIE.Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
и пароли для заполнения этих форм:
Код:

objForm.elements("oldpassw").value = "password"
objForm.elements("newpassw1").value = "Passwordnew"
objForm.elements("newpassw2").value = "Passwordnew"

А так же обработать ошибку, типа если не удалось подключится к IP из за того что не подошел стандартный пароль, забить на него и перейти к следующему устройству.

Armsinglom 11-02-2019 17:03 2857335

Немного доработал скрипт, была проблема с IE, он мог не работать по какой то причине и скрипт не отрабатывал. Добавил фикцию ожидания работоспособности IE:
Код:

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
objIE.Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
While objIE.Busy
    WScript.Sleep 200
Wend
Set objForm = objIE.Document.forms("frm")
objForm.elements("user_no").value = "130"
objForm.submit()
While objIE.Busy
    WScript.Sleep 200
Wend
Set objForm = objIE.Document.forms("frm")
objForm.elements("oldpassw").value = "password"
objForm.elements("newpassw1").value = "Passwordnew"
objForm.elements("newpassw2").value = "Passwordnew"
objForm.submit()
objIE.Visible = True

Теперь все работает отлично.
Но осталась еще задачи которые необходимо решить:
1) Заставить скрипт работать по алгоритму:
а) Брать IP для подключения из файлика (пароль и логин стандартные admin/password)
б) Если скрипту удалось авторизоваться под стандартными паролем и логином, то изменить его. (предварительно пароли уже есть сгенерированы и лежат в файлике)
в) Если авторизация на хосте не прошла, то ничего не делать, просто продолжаем работу с остальными хостами.
2) Сделать вывод результата в файл:
а) Не получилось авторизоваться
б) Получилось авторизоваться и установить такой-то пароль.
в) Хост не доступен

Iska 11-02-2019 20:53 2857371

Цитата:

Цитата Armsinglom
а) Брать IP для подключения из файлика (пароль и логин стандартные admin/password) »

Цитата:

Цитата Armsinglom
2) Сделать вывод результата в файл: »

С этим-то проблем не будет, если Вы покажете образец файла, упаковав его в архив и приложив к сообщению.

Armsinglom 11-02-2019 21:34 2857382

Вложений: 1
Ну на самом деле файл банальный, Exel, с несколькими полями.. (см. 123.jpg). При необходимости конечно, можно и поменять....
При необходимости можно добавить поля стандартного логина и пароля:
ip id pass def_login def_pass
10.37.116.114 103 Fsasfasfs5 admin password
10.37.116.115 104 SGssfaasg4 admin password
Как правильнее я не знаю, с VBS я на ВЫ...

Iska 11-02-2019 22:11 2857391

Вы можете упаковать банальный файл Excel в архив, каковой приложить к сообщению? Так, пришёл в личку.

И поясните, в какой файл планируется делать вывод.

Цитата:

Цитата Armsinglom
Как правильнее я не знаю, с VBS я на ВЫ... »

Ну, не совсем на Вы, судя по проделанной работе.

Armsinglom 11-02-2019 22:20 2857392

любой, но желательно csv с любым разделителем, что бы потом удобно было выгружать в exel и анализировать...

Armsinglom 12-02-2019 22:56 2857618

а подскажите VBS с exel работает примерно по такой технологии?
Код:

Sub Get_Value_From_Close_Book_Formula()

    Dim sPath As String, sFile As String, sShName As String

    sPath = "C:\Documents and Settings\" '"

    sFile = "Книга1.xls" '"

    sShName = "Лист1" '"

    Application.DisplayAlerts = 0

    With Range("A1:A100")

        .Formula = "='" & sPath & "[" & sFile & "]" & sShName & "'!" & "A1" '"

        '"A1" - указывается начальная ячейка диапазона, из которого необходимо получить значения

        .Value = .Value

    End With

    Application.DisplayAlerts = 1

End Sub


Iska 13-02-2019 00:00 2857629

Ну, смотрите:
Скрытый текст
Код:

Option Explicit

'Const READYSTATE_COMPLETE = 4


'Dim objIE

Dim objRange
Dim arrRow

Dim boolIsFirstRow
Dim i


With WScript.CreateObject("Excel.Application")
        With .Workbooks.Open("C:\Мои проекты\0244\ip-collector-025.xlsx")
                With .Worksheets.Item(1)
                        If .AutoFilterMode Then
                                boolIsFirstRow = True
                               
                                For Each objRange In .AutoFilter.Range.Rows
                                        If boolIsFirstRow Then
                                                boolIsFirstRow = False
                                               
                                                arrRow = .Application.Transpose(.Application.Transpose(objRange.Value2))
                                               
                                                WScript.Echo Join(arrRow, vbTab)
                                                WScript.Echo "--------------------------"
                                        Else
                                                arrRow = .Application.Transpose(.Application.Transpose(objRange.Value2))
                                               
                                                WScript.Echo Join(arrRow, vbTab)
                                               
                                                'For i = LBound(arrRow) To UBound(arrRow)
                                                '        WScript.Echo arrRow(i)
                                                'Next
                                        End If
                                Next
                        Else
                                WScript.Echo "Probably no Autofilter in first worksheet in this workbook."
                        End If
                End With
               
                .Close
        End With
       
        .Quit
End With

'Set objIE    = WScript.CreateObject("InternetExplorer.Application")
'
'With objIE
'        .Visible = False
'        .Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
'       
'        Do
'                WScript.Sleep 100
'        Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
'       
'       
'        With .Document.forms("frm")
'                .elements("user_no").value = "130"
'               
'                .submit()
'        End With
'       
'        Do
'                WScript.Sleep 100
'        Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
'       
'        With .Document.forms("frm")
'                .elements("oldpassw").value = "password"
'                .elements("newpassw1").value = "Passwordnew"
'                .elements("newpassw2").value = "Passwordnew"
'               
'                .submit()
'        End With
'       
'        .Visible = True
'End With
'
'Set objIE = Nothing

WScript.Quit 0


Содержимое столбцов будет построчно появляться в массиве arrRow(). Что есть что на Рабочем листе — смотрите сами, мне мало о чём говорят поля site и service. Примерный облагороженный вид Вашего кода — под комментариями.

Запись в файл простая — создали (или открыли для добавления и пишете, в конце — закрываете. Например, запишем всё содержимое рабочего листа в текстовый файл:
Скрытый текст
Код:

Option Explicit

'Const READYSTATE_COMPLETE = 4


'Dim objIE

Dim objRange
Dim arrRow

Dim boolIsFirstRow
Dim i

Dim objFSO
Dim objTS


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

With WScript.CreateObject("Excel.Application")
        With .Workbooks.Open("C:\Мои проекты\0244\ip-collector-025.xlsx")
                With .Worksheets.Item(1)
                        If .AutoFilterMode Then
                                boolIsFirstRow = True
                               
                                Set objTS = objFSO.CreateTextFile("C:\Мои проекты\0244\ip-collector-025.csv", True)
                               
                                For Each objRange In .AutoFilter.Range.Rows
                                        If boolIsFirstRow Then
                                                boolIsFirstRow = False
                                               
                                                arrRow = .Application.Transpose(.Application.Transpose(objRange.Value2))
                                               
                                                WScript.Echo Join(arrRow, vbTab)
                                                WScript.Echo "--------------------------"
                                               
                                                objTS.WriteLine Join(arrRow, ",")
                                        Else
                                                arrRow = .Application.Transpose(.Application.Transpose(objRange.Value2))
                                               
                                                WScript.Echo Join(arrRow, vbTab)
                                                objTS.WriteLine Join(arrRow, ",")
                                        End If
                                Next
                               
                                objTS.Close
                                Set objTS = Nothing
                        Else
                                WScript.Echo "Probably no Autofilter in first worksheet in this workbook."
                        End If
                End With
               
                .Close
        End With
       
        .Quit
End With

'Set objIE    = WScript.CreateObject("InternetExplorer.Application")
'
'With objIE
'        .Visible = False
'        .Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
'       
'        Do
'                WScript.Sleep 100
'        Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
'       
'       
'        With .Document.forms("frm")
'                .elements("user_no").value = "130"
'               
'                .submit()
'        End With
'       
'        Do
'                WScript.Sleep 100
'        Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
'       
'        With .Document.forms("frm")
'                .elements("oldpassw").value = "password"
'                .elements("newpassw1").value = "Passwordnew"
'                .elements("newpassw2").value = "Passwordnew"
'               
'                .submit()
'        End With
'       
'        .Visible = True
'End With
'
'Set objIE = Nothing

WScript.Quit 0


Мне, правда, не очень понятно, зачем писать именно в текстовый файл, чтобы открывать его потом в Excel, вместо того, чтобы зараз писать непосредственно в Рабочую книгу Excel, коль мы так и так Excel пользуем в коде.

Armsinglom 13-02-2019 00:14 2857632

Спасибо огромное.
Немного не понял вот эти части скрипта :
Код:

Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
и
Код:

'                .elements("oldpassw").value = "password"
'                .elements("newpassw1").value = "Passwordnew"
'                .elements("newpassw2").value = "Passwordnew"

IP и пароли не из файла берутся??

Iska 13-02-2019 00:36 2857635

Цитата:

Цитата Armsinglom
Немного не понял вот эти части скрипта : »

Это Ваш код.

Цитата:

Цитата Armsinglom
IP и пароли не из файла берутся?? »

Вы же не привели соответствия между перечисленным и полями в присланной Рабочей книге. Приведёте, что откуда брать — продолжим.

Armsinglom 13-02-2019 00:53 2857638

Понял, сейчас постараюсь донести мои мысли :)
Код:

Navigate "http://admin:password@10.37.167.114/chgpassw.htm"
Сюда мы должны подставить IP из присланного мной файлика. Столбец "A". http://admin:password не трогаем, это дефолтная данные авторизации.
Код:

.elements("newpassw1").value = "Passwordnew"
.elements("newpassw2").value = "Passwordnew"

Сюда подставить 2 раза пароль взятый из столбца "C"
И вывести результат в файл, даже можно и в этот файл в пустые столбцы, допустим "F;G и т.д."

т.е. задумка в чем, скрипт подключается по всем IP адресам из этого файла, пробует авторизоваться под стандартным admin/password, если ему это удается, то он меняет пароль на тот который в столбце "C". Если авторизация не успешна на каком то из IP, это нам говорит о том что там пароль не дефолтный и делать соответственно нам с ним нечего не надо, продолжаем проверять остальные строки...

столбы с названием SITEID это просто номинальный номер устройства(для быстрого поиска). Столбец с названием Serviсe нас тоже не интересует.

Iska 13-02-2019 01:16 2857640

Пробуйте (по понятным причинам — не проверялось):
Скрытый текст
Код:

Option Explicit

Const READYSTATE_COMPLETE = 4


Dim objIE

Dim objRange
Dim arrRow

Dim boolIsFirstRow


Set objIE = Nothing

With WScript.CreateObject("Excel.Application")
        With .Workbooks.Open("C:\Мои проекты\0244\ip-collector-025.xlsx")
                With .Worksheets.Item(1)
                        If .AutoFilterMode Then
                                boolIsFirstRow = True
                               
                                For Each objRange In .AutoFilter.Range.Rows
                                        If boolIsFirstRow Then
                                                boolIsFirstRow = False
                                        Else
                                                arrRow = .Application.Transpose(.Application.Transpose(objRange.Value2))
                                               
                                                If objIE Is Nothing Then
                                                        Set objIE = WScript.CreateObject("InternetExplorer.Application")
                                                End If
                                               
                                                With objIE
                                                        .Navigate "http://admin:password@" & arrRow(0) & "/chgpassw.htm"
                                                       
                                                        Do
                                                                WScript.Sleep 100
                                                        Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
                                                       
                                                       
                                                        With .Document.forms("frm")
                                                                .elements("user_no").value = "130"
                                                               
                                                                .submit()
                                                        End With
                                                       
                                                        Do
                                                                WScript.Sleep 100
                                                        Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
                                                       
                                                        With .Document.forms("frm")
                                                                .elements("oldpassw").value  = "password"
                                                                .elements("newpassw1").value = arrRow(2)
                                                                .elements("newpassw2").value = arrRow(2)
                                                               
                                                                .submit()
                                                        End With
                                                       
                                                        ' А результат-то где?!
                                                End With
                                        End If
                                Next
                        Else
                                WScript.Echo "Probably no Autofilter in first worksheet in this workbook."
                        End If
                End With
               
                .Close
        End With
       
        .Quit
End With

If Not objIE Is Nothing Then
        objIE.Quit
        Set objIE = Nothing
End If
WScript.Quit 0



Цитата:

Цитата Armsinglom
И вывести результат в файл, »

Какой результат? Я не вижу в Вашем коде ничего, похожего на результат.

Armsinglom 13-02-2019 01:35 2857643

Вложений: 1
ошибка... прикрепил скрин

Iska 13-02-2019 01:48 2857644

Давайте попробуем поменять:
Код:

.Navigate "http://admin:password@" & arrRow(1) & "/chgpassw.htm"

.elements("newpassw1").value = arrRow(3)
.elements("newpassw2").value = arrRow(3)


Armsinglom 13-02-2019 01:55 2857646

Вложений: 1
Другая ошибка...

Iska 13-02-2019 02:32 2857648

У меня строка 37 — «Do». Покажите получившийся у Вас код.

Armsinglom 13-02-2019 10:18 2857683

Код:

Option Explicit

Const READYSTATE_COMPLETE = 4


Dim objIE

Dim objRange
Dim arrRow

Dim boolIsFirstRow


Set objIE = Nothing

With WScript.CreateObject("Excel.Application")
        With .Workbooks.Open("C:\Users\gzg\Desktop\ip.xlsx")
                With .Worksheets.Item(1)
                        If .AutoFilterMode Then
                                boolIsFirstRow = True
                               
                                For Each objRange In .AutoFilter.Range.Rows
                                        If boolIsFirstRow Then
                                                boolIsFirstRow = False
                                        Else
                                                arrRow = .Application.Transpose(.Application.Transpose(objRange.Value2))
                                               
                                                If objIE Is Nothing Then
                                                        Set objIE = WScript.CreateObject("InternetExplorer.Application")
                                                End If
                                               
                                                With objIE
                                                        .Navigate "http://admin:password@" & arrRow(1) & "/chgpassw.htm"
                                                       
                                                        Do
                                                                WScript.Sleep 100
                                                        Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
                                                       
                                                       
                                                        With .Document.forms("frm")
                                                                .elements("user_no").value = "130"
                                                               
                                                                .submit()
                                                        End With
                                                       
                                                        Do
                                                                WScript.Sleep 100
                                                        Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
                                                       
                                                        With .Document.forms("frm")
                                                                .elements("oldpassw").value  = "password"
                                                                .elements("newpassw1").value = arrRow(3)
                                                                .elements("newpassw2").value = arrRow(3)
                                                               
                                                                .submit()
                                                        End With
                                                       
                                                        ' А результат-то где?!
                                                End With
                                        End If
                                Next
                        Else
                                WScript.Echo "Probably no Autofilter in first worksheet in this workbook."
                        End If
                End With
               
                .Close
        End With
       
        .Quit
End With

If Not objIE Is Nothing Then
        objIE.Quit
        Set objIE = Nothing
End If
WScript.Quit 0


Armsinglom 13-02-2019 23:36 2857862

Получается что ругается вот на это:
Код:

Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
Я правильно понимаю что мы ждем выполнения вот этой строки:
Код:

.Navigate "http://admin:password@" & arrRow(1) & "/chgpassw.htm
она не отрабатывает и скрипт умирает?

Вообщем при разных запусках скрипта может вылетать две ошибки:

- The object invoked has disconnected from its client. (80010108)
- Unspecified error (80004005)

и ругаются на одну и туже строку.

Armsinglom 11-09-2019 21:41 2887551

Возобновлю тему.
Мне удалось заставить работать скрипт (проблема была вызвана с ограничениями на rdp).
Код:

Option Explicit

Const READYSTATE_COMPLETE = 4


Dim objIE

Dim objRange
Dim arrRow

Dim boolIsFirstRow


Set objIE = Nothing

With WScript.CreateObject("Excel.Application")
        With .Workbooks.Open("C:\Users\gzg\Desktop\ip.xlsx")
                With .Worksheets.Item(1)
                        If .AutoFilterMode Then
                                boolIsFirstRow = True
                               
                                For Each objRange In .AutoFilter.Range.Rows
                                        If boolIsFirstRow Then
                                                boolIsFirstRow = False
                                        Else
                                                arrRow = .Application.Transpose(.Application.Transpose(objRange.Value2))
                                               
                                                If objIE Is Nothing Then
                                                        Set objIE = WScript.CreateObject("InternetExplorer.Application")
                                                End If
                                               
                                                With objIE
                                                        .Navigate "http://admin:password@" & arrRow(1) & "/chgpassw.htm"
                                                       
                                                        Do
                                                                WScript.Sleep 100
                                                        Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
                                                       
                                                       
                                                        With .Document.forms("frm")
                                                                .elements("user_no").value = "130"
                                                               
                                                                .submit()
                                                        End With
                                                       
                                                        Do
                                                                WScript.Sleep 100
                                                        Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
                                                       
                                                        With .Document.forms("frm")
                                                                .elements("oldpassw").value  = "password"
                                                                .elements("newpassw1").value = arrRow(3)
                                                                .elements("newpassw2").value = arrRow(3)
                                                               
                                                                .submit()
                                                        End With
                                                       
                                                        ' А результат-то где?!
                                                End With
                                        End If
                                Next
                        Else
                                WScript.Echo "Probably no Autofilter in first worksheet in this workbook."
                        End If
                End With
               
                .Close
        End With
       
        .Quit
End With

If Not objIE Is Nothing Then
        objIE.Quit
        Set objIE = Nothing
End If
WScript.Quit 0

Есть пару проблем,
1) он почему то работает только с последним ip из списка
Код:

With .Workbooks.Open("C:\Users\gzg\Desktop\ip.xlsx"
)
2) Так же есть проблема, если вдруг стандартный логин/пароль который указан в скрипте не подошел, то выскакивает окно для повторной попытки ввода логин/пароль. Из за проблемы которая в пункте 1, я не пойму будет он работать дальше, несмотря на ошибку авторизации или будет ждать пока я ввиду вручную корректные логин/пароль.

Iska 11-09-2019 22:38 2887554

Цитата:

Цитата Armsinglom
1) он почему то работает только с последним ip из списка »

Он работает со всеми строками из диапазона автофильтра:
Код:

For Each objRange In .AutoFilter.Range.Rows
Цитата:

Цитата Armsinglom
2) Так же есть проблема, если вдруг стандартный логин/пароль который указан в скрипте не подошел, то выскакивает окно для повторной попытки ввода логин/пароль. Из за проблемы которая в пункте 1, я не пойму будет он работать дальше, несмотря на ошибку авторизации или будет ждать пока я ввиду вручную корректные логин/пароль. »

Без понятия. Вставляйте отладочные WScript.Echo "…" и смотрите.


Время: 20:03.

Время: 20:03.
© OSzone.net 2001-