• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Lotus и SQLDMO

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Всем привет!
Вот сижу мучаюсь.... есть задача найти все доступные MSSQL-сервера в сети.
В нете нашел вот такой пример
Код:
Public Function AvailableSQLServers() As String()
'***********************************************
'PURPOSE:	  Returns array list name of all SQL Servers
'			  on the network that are visible to the
'			  machine
'
'RETURNS:	  String array containing names of all
'			  available SQL Servers (or an array with one
'			  element containing empty string if no
'			  SQL Servers are available/visible)

'REQUIRES:	 Reference to Microsoft SQLDMO object library
'			  VB6 Because array is returned
'			  Assumes Option Base is not set to 1
'			  If you don't have VB6, and/or Option Base 1
'			  is set, it should not be very hard to modify
'			  this code for you own purposes

'EXAMPLE:
'Dim sServers() As String
'Dim iCtr As Integer

'sServers = AvailableSQLServers
'If sServers(0) = "" Then
'	MsgBox "No SQL Servers Available"
'Else
'	For iCtr = 0 To UBound(sServers)
'	  Debug.Print sServers(iCtr)
'  Next
'End If
'***********************************************
Dim oServer As New SQLDMO.Application
Dim oNameList As SQLDMO.NameList
Dim iElement As Integer
Dim sAns() As String
Dim lCtr As Long, lCount As Long

On Error GoTo ErrorHandler

ReDim sAns(0) As String
Set oNameList = oServer.ListAvailableSQLServers

With oNameList
lCount = .Count
If lCount > 0 Then
For lCtr = 1 To .Count
iElement = IIf(sAns(0) = "", 0, UBound(sAns) + 1)
ReDim Preserve sAns(iElement) As String
sAns(iElement) = oNameList.Item(lCtr)
Next
End If
End With

AvailableSQLServers = sAns
Exit Function

ErrorHandler:
'Return array with one empty element on error
ReDim sAns(0) As String
AvailableSQLServers = sAns
End Function
Но переделать его под скрипт не получается
 
H

hosm

имхо, мало инфы. А в чем собственно проблемы с кодом, что-то вообще делали?
вылезают какие-то ошибки при инициализации объекта "SQLDMO.Application"?
Был как-то по моей задаче кусок кода для работы с одним API, все нужные компоненты были установлены и описалки констант были, так особых проблем переделки под скрипт не заметила.
Для начала нужно описать SQLDMO-объекты без New, просто As Variant. И попытаться создать объект "SQLDMO.Application" через CreateObject.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
OKEN
Это понятно... я же написал что пример не для скрипта

Для начала нужно описать SQLDMO-объекты без New, просто As Variant. И попытаться создать объект "SQLDMO.Application" через CreateObject.
это понятно... делаю так
Код:
Set oServer = CreateObject( "SQLDMO.Application" )
Set oNameList = CreateObject( "SQLDMO.NameList" )
ошибка во второй строке
 
A

Akupaka

а в примере выше было

Код:
Set oNameList = oServer.ListAvailableSQLServers
может стоит оставить так же?..
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
пробовал... не получается...
Сейчас вот читаю по этому объекту... что-то ListAvailableSQLServers не нахожу
 
A

Akupaka

я не знаю поможет ли... у меня объект SQLDMO.Application не создается... видать надо что-то ставить...

Код:
Public Function AvailableSQLServers() As Variant
Dim oServer As Variant
Dim oNameList As Variant
Dim sAns As Variant

Set oServer = CreateObject("SQLDMO.Application")

On Error Goto ErrorHandler

Set oNameList = oServer.ListAvailableSQLServers()

With oNameList
lCount = .Count
If lCount > 0 Then
For lCtr = 1 To .Count
If Isarray(sAns) Then
Redim Preserve sAns (Lbound(sAns) To Ubound(sAns) + 1)
Else
Redim sAns (0 To 0)
End If
sAns(Ubound(sAns)) = oNameList.Item(lCtr)
Next
End If
End With

AvailableSQLServers = sAns
Exit Function

ErrorHandler:
'Return array with one empty element on error
Redim sAns(0) As String
AvailableSQLServers = sAns
End Function
 
H

hosm

C кодом Akupaka согласна, в принципе :)
но где-то по ходу ссылки попадались, что ListAvailableSQLServers глючил. И еще, что его убрать могут в след. версиях
Хотела найти альтернативу - не нашла
я не смогу посмотреть, нет этих компонентов...
пробовал... не получается...
Сейчас вот читаю по этому объекту... что-то ListAvailableSQLServers не нахожу
Вот что для 2000 по этому методу, например:

кстати, если не получится самому разобраться, может, стоит указать, что за ошибка (это большой секрет?) и погуглить по ней, есть ведь в коде обработчик.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
OKEN Akupaka
Спасибо!!! С этим уже разобрался. Буду ковырять дальше!
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
проблемы продолжаются.... :)
Оказалось получить список серверов легче всего
теперь пытаюсь соединиться с сервером
Код:
	Set oServer = CreateObject( "SQLDMO.SQLServer" )
oServer.LoginSecure = True
oServer.Connect ServerName
в итоге ошибка с предложение использовать SQL Server Management Studio
 
A

Akupaka

гы, тут, вероятно, МС решило ограничить пользователей ))
расскажи задачу, может кто подскажет что-то интересное...
 
H

hosm

ну, раз тишина - мои "5 копеек".
может, и не в тему (искать влом), но рассмотрите как вариант: возможно, у Connect есть какие-то еще нужные параметры, которые не указаны. Или настройки, необходимые перед его вызовом.
встречались траблы из-за параметра(ов?) какого-то метода (не Connect), который вроде не был обязателен, но требовался (явно быть в наличии) для моей задачи :)
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
гы, тут, вероятно, МС решило ограничить пользователей ))
расскажи задачу, может кто подскажет что-то интересное...
Прошу прощения.... дома инета не было.
Задача: получить перечень возможных баз данных на сервере.

OKEN
Праметры Connect имя сервера, имя пользователя и пароль. Последние два не обязательны, если нужна аутентификафия по виндовому логину.
А вот oServer.LoginSecure = True и есть переключение на аутентификацию по виндовому логину
 
A

Akupaka

а если не использовать аутентификацию системы, а указать принудительно?..
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
придительно не есть хорошо :unsure:
Пароли меняются каждый месяц....
 
A

Akupaka

хорошо или нет, я не интересовался :unsure:
нужно проверить подключается ли оно хоть как-то!
если будет только принудительно подключатся, то это уже плохо, но можно сделать свою форму для аутентификации...
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Пробовал... не подключается никак :)
Все та же ошибка

Сделать можно все... но овчинка выделки не стоит... хотел обойтись минимальными затратами.
 
A

Akupaka

java не предлагает подобных решений? :)
где наши знатоки?.. ;)

а с помощью LotusScript Extensions for Lotus Connectors (LC LSX) нельзя решить задачу?..
виндошная аутентификация (по крайней мере на MS SQL) там возможна точно.
в хэлпе описан метод, который делает что-то похожее на твою задачу, правда, я им не пользовался...

LCConnection.Catalog
Produce a result set containing a list of servers, databases, tables or views, indexes, or fields in a table, that are available through this connection. Each record in the result set describes one server, database, table, and so on.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Сделал!
Список серверов получаю через SQLDMO
А для баз пользуюсь ADO. Ну и далее все манипуляции с данными проходят через ADO
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!