Форум » [x]Harbour » Доступ к сетевым ресурсам. » Ответить

Доступ к сетевым ресурсам.

Dazzler: Добрый день. Подскажите пожалуйста, есть ли в Harbour функции доступа к сетевым ресурсам под определенной учетной записью? Например: Надо взять файл с ресурса \\serv1\folders2\load.txt Доступ туда имеет учетная запись: user: mdomen\user10 passw: Qazwsx!12

Ответов - 48, стр: 1 2 3 All

AlexMyr: Можно поступить так: c_user := "mdomen\user10" c_pass := "Qazwsx!12" hb_processRun('net use x: \\serv1\folders2 '+c_pass+' /USER:'+c_user) hb_FCopy( "x:\load.txt", "c:\load.txt" ) hb_processRun('net use x: /DEL')

Dazzler: Спасибо!

Andrey: Можно ли получить список доступных сетевых ресурсов из программы ?


Pasha: Поскольку UNC не включает в себя параметры авторизации, сетевой ресурс надо подключать отдельно. Это можно сделать функцией NetRedir() из ct, с подключением сетевого диска. Есть еще функция WNetAddConnection2 из winapi, и она вроде бы работает и без подключения диска. Но для нее надо писать обертку. Получить список ресурсов в сети можно функциями winapi WNetOpenEnum WNetCloseEnum WNetEnumResource. Как это сделать - смотреть примеры в инете. Для харбора кажется оберток для этих функций никто не делал, впрочем, может быть я ошибаюсь, ищите.

LYSK: ! net view > xxx.txt ... ! net view \\srv >yyy.txt ... и разобрать полученные тексты. если знаешь что искать, найти несложно )

Andrey: Спасибо Pasha за обстоятельный ответ ! LYSK пишет: net view > xxx.txt Простое решение, только почему то на 64х-бит висит и не дает ответа...

Dima: Andrey пишет: Простое решение, только почему то на 64х-бит висит и не дает ответа... Проверил на Windows server 2008 64 бита , работает нормик. Не висит.

Andrey: Dima пишет: Проверил на Windows server 2008 64 бита , работает нормик. Не висит. А как тогда снять повисшую программу: net view > xxx.txt через 2 минуты, если не откликается ?

Dima: Andrey CTRL+C 2 минуты это очень долго , либо сеть у тебя огромная либо лаги в сети. у меня в сети 50 компов и net view задумывается не более чем на 3-5 секунд

Andrey: Dima пишет: 2 минуты это очень долго , либо сеть у тебя огромная либо лаги в сети. Согласен. А вдруг у юзера тоже такое вылезет ? Вот я и спрашиваю как снять процесс, если нет отклика 2 минуты ? hb_processRun('net view > xxx.txt') .......

Dima: Andrey пишет: Вот я и спрашиваю как снять процесс Посмотри тему может поможет http://forums.fivetechsupport.com/viewtopic.php?f=3&t=27079

PSP: Andrey странно, что зависает.

AlexMyr: Andrey пишет: Вот я и спрашиваю как снять процесс, если нет отклика 2 минуты ? hb_processRun('net view > xxx.txt' Откуда уверенность что висит, в списке процессов показывает что 'не отвечает'? Какой результат будет в cmd, возможно какая-то станция долго обрабатывает запрос. У меня есть парочка компов которые открываются в сетевом окружении около минуты, лень разбираться, для меня не критично, но проблемы похоже с настройками сети.

Andrey: AlexMyr пишет: Откуда уверенность что висит, в списке процессов показывает что 'не отвечает'? Какой результат будет в cmd, возможно какая-то станция долго обрабатывает запрос. 3 компа в сети с роутером. Один сильно навороченный, с непонятной сетевой картой. Win8 64bit. 5 минут ждал, устал.... Процесс висит и ничего не сообщает. AlexMyr пишет: У меня есть парочка компов которые открываются в сетевом окружении около минуты, лень разбираться, для меня не критично, но проблемы похоже с настройками сети. Вот на такой случай, я и хочу подстраховаться. Я не знаю где и какая будет сетка. Для этого случая и хочу иметь резерв 2-3 минуты и сообщить юзеру, что не могу прочитать эту сетку. Пускай настраивает ручками.

PSP: Andrey пишет: Один сильно навороченный, с непонятной сетевой картой. Win8 64bit. 5 минут ждал, устал.... Процесс висит и ничего не сообщает. Выполни эту команду вручную на этом компе и посмотри, что она выводит.

Dima: Andrey пишет: Вот я и спрашиваю как снять процесс [pre2] FUNCTION KillProceso ( cProceso ) #ifndef __XHARBOUR__ #xcommand TRY => BEGIN SEQUENCE WITH {|e| Break( e )} #xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr-> #endif Local oWMIob, oWMIserver, aProcess, objProcess try oWMIob := CreateObject( "wbemScripting.SwbemLocator" ) catch RETURN nil END oWMIserver := oWMIob:ConnectServer() aProcess :=oWMIserver:ExecQuery( "Select * from Win32_Process" ) For Each objProcess in aProcess IF UPPER(objProcess:Name) = UPPER(cProceso) objProcess:Terminate() ENDIF next RETURN nil [/pre2] Проверил пашет однако и по ходу через WMI можно видимо и список компов получить и не только .

Andrey: Dima пишет: Проверил пашет однако А как проверял ? Dima пишет: по ходу через WMI можно видимо и список компов получить Покажи как ?

Dima: Andrey пишет: А как проверял ? Указал процесс который надо прибить функции KillProceso() Например KillProceso("firefox.exe") Насчет компов не в курсе и много доки курить надо или гуглить

Haz: Dima пишет: по ходу через WMI можно видимо и список компов получить когда то искал, делая инвентаризацию оборудования и софта по сети .... не нашел. Есть только имя по IP. Выкрутился тогда просто сканируя сеть по маске IP от 0 ..255 и составляя список живых Андрей - пример есть в минигуи, а возможные запросы вот: http://msdn.microsoft.com/en-us/library/windows/desktop/aa394585(v=vs.85).aspx

Dima: Haz А не подскажешь как программно убить задачу на определенном компе по IP или имени ? Из CMD это примерно выглядит так Wmic /node:@computers.txt process where (caption=”notepad.exe”) call terminate

Sergy: Dima пишет: А не подскажешь как программно убить задачу на определенном компе по IP или имени ? Из CMD это примерно выглядит так Wmic /node:@computers.txt process where (caption=”notepad.exe”) call terminate А что мешает сделать: RUN("cmd /c Wmic /node:@computers.txt process where (caption=”notepad.exe”) call terminate")

Dima: Да ни чего не мешает , не люблю такие подходы если возможен нормальный путь , программный. Это примерно тоже самое если вместо функции directory() юзать RUN("dir") с разбором строки.

Andrey: Dima пишет: Да ни чего не мешает , не люблю такие подходы если возможен нормальный путь , программный. +1

Haz: Dima пишет: А не подскажешь как программно убить задачу на определенном компе по IP или имени ? не пробовал но возможно примерно так 1 подключиться к компу по вми примерно так цеплялся oLocator := CreateObject( "wbemScripting.SwbemLocator" ) oWMI := oLocator:ConnectServer('192.168.0.107',,'domain\user', 'password') 2 получить список процессов 3 убить выбранный PS но остается вопрос с правами на эти действия http://msdn.microsoft.com/en-us/library/windows/desktop/aa394589(v=vs.85).aspx

Andrey: Haz Давай пример в студию ! Очень хочется посмотреть !

Haz: Andrey пишет: Давай пример в студию ! Какой именно ? если для локального компа - Dima привел уже рабочий, если для удаленки - то это параметры в :ConnectServer , примерно такие ( подробнее нужно гуглить "wbemScripting.SwbemLocator" ) oLocator := CreateObject( "wbemScripting.SwbemLocator" ) oWMI := oLocator:ConnectServer( cComputer,'root\CIMV2','cUser', 'cPass') если успешно подключились - Valtype(oWMI) == 'O' , то можно объекту подсунуть любой его разрешенный запрос SELECT * ... PS. Если задачу запускать из под учетки администратора домена ( именно так и делал когда-то ) , то к любому компу в домене легко цепляется без явного указания пользователя, пароля и пространства имен - oWMI := oLocator:ConnectServer(cComputer,,,,,,128)

Dima: Haz Спасибо идею понял !

Dima: Haz пишет: oWMI := oLocator:ConnectServer(cComputer,,,,,,128) Если IP не доступен то вот такая бяка вылазит [pre2] Error WINOLE/1007 ╤σ≡Γσ≡ RPC φσΣε±≥≤∩σφ. (0x800706BA): SWbemLocator (DOS Error -2147352567) Called from TOLEAUTO:CONNECTSERVER(0) [/pre2] Как бы пролечить ? Средствами WMI можно проверить доступность IP адреса ?

Haz: По сути успешный коннект и есть доступность Можно все делать в обработчике ошибок и проверять типы Valtype(oLacator) == 'O' Valtype(oWmi) == 'O' у меня в случае недоступного IP oWMI := oLocator:ConnectServer(cComputer,,,,,,128) просто висит чуть дольше , но не валиться кстати cComputer это можбыть не только адрес но и сетевое имя, может с ним поппробывать

Dima: Haz пишет: oWMI := oLocator:ConnectServer(cComputer,,,,,,128 Сделал так try oWMIserver := oWMIob:ConnectServer(cComputer,,,,,,128) catch ? "Bad IP" return END

Haz: ))) мысли сходятся PS отпишись чего да как потом получится - тоже интересно .

Dima: Haz Отписываюсь ;) Не пашет почему то. Работает только на том компе на котором прога лежит. Указав любой живой IP прога кажет Error Исходник на скорую руку. Вроде должно пахать а не пашет ;) [pre2] Proc main (...) local apar apar:=hb_aparams() if len(apar)==0 quit endif ListProcIP(apar[1]) return FUNCTION ListProcIP (cip) #ifndef __XHARBOUR__ #xcommand TRY => BEGIN SEQUENCE WITH {|e| Break( e )} #xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr-> #endif Local oWMIob, oWMIserver, aProcess, objProcess Try oWMIob := CreateObject( "wbemScripting.SwbemLocator" ) oWMIserver := oWMIob:ConnectServer(cip,,,,,,128) Catch ? "Error" RETURN nil End if Valtype(oWMIserver) == 'O' .and. Valtype(oWMIob) == 'O' aProcess :=oWMIserver:ExecQuery( "Select * from Win32_Process" ) For Each objProcess in aProcess ? objProcess:Name next else ? "Object Error" endif RETURN nil [/pre2] Если вот так Test 127.0.0.1 или Test IP адрес компа на котором эта прога лежит то все работает.

PSP: Брандмауэр не рубит выход проги в сеть?

Dima: PSP пишет: Брандмауэр не рубит выход проги в сеть? Нет , выключен он

PSP: Тогда, возможно, недостаточно прав пользователя. Наверное, надо указать, под каким юзером производится подключение http://msdn.microsoft.com/en-us/library/aa393720%28v=vs.85%29.aspx

Dima: PSP Надо будет пробнуть , хотя думал и так прокатит Haz пишет: Если задачу запускать из под учетки администратора домена ( именно так и делал когда-то ) , то к любому компу в домене легко цепляется без явного указания пользователя, пароля и пространства имен -

Haz: скорее всего в правах доступа засада, года два назад именно так и запускал задачу с сервера под админской учеткой . и без проблем лазил по компам

Dima: Haz Видимо надо копать в сторону Security_.Privileges.AddAsString

Haz: видимо , но тут я пас ((

Dima: При желании можно функцию перевести и на Harbour http://infostart.ru/public/165702/ смотрим "Функция получения информации о сетевом окружении." я было начал но потом работы накидали по самое не хочу [pre2] ShellApplication := CreateObject("Shell.Application") Network:= ShellApplication:NameSpace(18) EntireNetwork:= Network:Items():Item("EntireNetwork"):GetFolder [/pre2] PS Тоже самое только проще (test.vbs) // проверил работает нормик [pre2] Set Shell = CreateObject("Shell.Application") 'получение папки "Сетевое окружение" Set objFolder = Shell.NameSpace("::{208D2C60-3AEA-1069-A2D7-08002B30309D}") 'получение папки "Вся сеть" Set objFolder = objFolder.Items().Item("EntireNetwork").GetFolder 'получение папки "Microsoft Windows Network" For Each objItem In objFolder.Items() If objItem.Name = "Microsoft Windows Network" Then Set objFolderNetwork = objItem.GetFolder End If Next 'перебор доменов и рабочих групп For Each objItem In objFolderNetwork.Items() If objItem.IsFolder Then Set objFolder = objItem.GetFolder 'перебор компьютеров For Each objSubItem In objFolder.Items() WScript.Echo objSubItem.Name Next End If Next [/pre2]

Dima: Выкроил минутку ;) Пробуем в лоб перевести VBScript на Harbour В тексте указал где падает прога и хз почему [pre2] Proc main local Shell local objFolder local objFolderNetwork local objItem local objSubItem Shell:=CreateObject("Shell.Application") // 'получение папки "Сетевое окружение" objFolder:=Shell:NameSpace("::{208D2C60-3AEA-1069-A2D7-08002B30309D}") // 'получение папки "Вся сеть" objFolder:=objFolder:Items():Item("EntireNetwork"):GetFolder // 'получение папки "Microsoft Windows Network" For Each objItem In objFolder:Items() // а вот тут почему то падает //Error WINOLE/1005 Argument error: __OLEENUMCREATE (DOS Error -2147352573) If objItem:Name == "Microsoft Windows Network" objFolderNetwork:= objItem:GetFolder exit EndIf Next // 'перебор доменов и рабочих групп For Each objItem In objFolderNetwork:Items() If objItem:IsFolder objFolder:=objItem:GetFolder // 'перебор компьютеров For Each objSubItem In objFolder:Items() ? objSubItem:Name Next EndIf Next return [/pre2]

Andrey: Dima пишет: For Each objItem In objFolder:Items() // а вот тут почему то падает А что будет если получить ? objFolder:Items() хХарбор 1.2.1 падает на строке: // 'получение папки "Вся сеть" objFolder:=objFolder:Items():Item("EntireNetwork"):GetFolder

Andrey: Dima пишет: PS Тоже самое только проще (test.vbs) // проверил работает нормик Не работает: Win8 32bit

Dima: Andrey пишет: Win8 32bit я проверял на XP у себя и удаленно тож на XP , работало. Счас чекану на 2008 64 бит удаленно Проверил та же фигня что у тебя.......

Andrey: Взял функцию из 1С. Язык еще тот... Без вливания не разберешься... Не знаю как перевести части кода (пометил красным цветом) Вот код: * Translation 1C at Harbour http://clipper.borda.ru #define Функция Function #define КонецФункции Return Nil #define Если IF #define Тогда THEN #define КонецЕсли; ENDIF #define Прервать; EXIT #define Для Каждого FOR #define КонецЦикла; NEXT #define нПП nI #define ---> Добавляйте // Функция получения информации о сетевом окружении. // Возвращает: // Таблица значений со структурой: // №, Домен, Компьютер, IP-адрес, Комментарий. // // Рекомендация: // Перед применением проверить на компьютерах // Windows Management Instrumentation (WMI): // 1. Состояние служб. // 2. Разрешение в брандмауэре. // // Примечание: // 1. WMI - медленнее, PING - быстрее. // 2. WMI - безоконный, PING - с формированием окна. // &НаСервереБезКонтекста Функция NetworkNeighborhood() ТСетевоеОкружение = Новый ТаблицаЗначений; ТСетевоеОкружение.Колонки.Добавить("нПП", ,"№"); ТСетевоеОкружение.Колонки.Добавить("Домен"); ТСетевоеОкружение.Колонки.Добавить("Компьютер"); ТСетевоеОкружение.Колонки.Добавить("IP"); ТСетевоеОкружение.Колонки.Добавить("Комментарий"); Попытка ShellApplication = Новый COMОбъект("Shell.Application"); // Сетевое окружение. Network = ShellApplication.NameSpace(18); // Вся сеть. EntireNetwork = Network.Items().Item("EntireNetwork").GetFolder; Для Каждого EntireNetworkItem ИЗ EntireNetwork.Items() Цикл Если EntireNetworkItem.Name = "Microsoft Windows Network" Тогда MicrosoftWindowsNetwork = EntireNetworkItem.GetFolder; Прервать; КонецЕсли; КонецЦикла; нПП = 0; Для Каждого MicrosoftWindowsNetworkItem ИЗ MicrosoftWindowsNetwork.Items() Цикл // Рабочая группа или Домен. Domain = MicrosoftWindowsNetworkItem.GetFolder; Домен = ВРег(Domain.Title); НоваяСтрока = ТСетевоеОкружение.Добавить(); нПП = нПП+1; НоваяСтрока.нПП = нПП; НоваяСтрока.Домен = Домен; Для Каждого DomainItem ИЗ Domain.Items() Цикл // Компьютер. Компьютер = ВРег(DomainItem.Name); НоваяСтрока = ТСетевоеОкружение.Добавить(); нПП = нПП+1; НоваяСтрока.нПП = нПП; НоваяСтрока.Домен = Домен; НоваяСтрока.Компьютер = Компьютер; Попытка WinMGMT = ПолучитьCOMОбъект("winmgmts:\\" + Компьютер + "\root\cimv2"); // Без вывода окна на экран. IPConfig = WinMGMT.ExecQuery("Select IPAddress from Win32_NetworkAdapterConfiguration where ipenabled = true"); // IP-адреса. Для Каждого IPCFG ИЗ IPConfig Цикл Если ЗначениеЗаполнено(IPCFG.IPAddress) Тогда Для Каждого IP ИЗ IPCFG.IPAddress Цикл НоваяСтрока = ТСетевоеОкружение.Добавить(); нПП = нПП+1; НоваяСтрока.нПП = нПП; НоваяСтрока.Домен = Домен; НоваяСтрока.Компьютер = Компьютер; НоваяСтрока.IP = IP; НоваяСтрока.Комментарий = "WMI"; КонецЦикла; КонецЕсли; КонецЦикла; Исключение Сообщить("Проверьте на компьютере " + Компьютер + " |Windows Management Instrumentation (WMI): |1. Состояние служб, отвечающих за WMI; |2. Разрешение в брандмауэре для WMI."); WshShell = Новый COMОбъект("WScript.Shell"); // Exec - выводит окно на экран. WshExec = WshShell.Exec("ping -n 1 " + Компьютер); TextStream = WshExec.StdOut; // IP-адреса. Пока НЕ TextStream.AtEndOfStream Цикл СтрокаIP = TextStream.ReadLine(); ПозицияСкобкиЛевая = Найти(СтрокаIP, "["); Если ПозицияСкобкиЛевая > 0 Тогда ПозицияСкобкиПравая = Найти(СтрокаIP, "]"); IP = Сред(СтрокаIP, ПозицияСкобкиЛевая+1, ПозицияСкобкиПравая-ПозицияСкобкиЛевая-1); НоваяСтрока = ТСетевоеОкружение.Добавить(); нПП = нПП+1; НоваяСтрока.нПП = нПП; НоваяСтрока.Домен = Домен; НоваяСтрока.Компьютер = Компьютер; НоваяСтрока.IP = IP; НоваяСтрока.Комментарий = "PING"; Прервать; КонецЕсли; КонецЦикла; КонецПопытки; КонецЦикла; КонецЦикла; Исключение КонецПопытки; Возврат ТСетевоеОкружение; КонецФункции

Dima: Andrey пишет: Взял функцию из 1С. Язык еще тот... Без вливания не разберешься... Да тут без 100 грамм точно не обойтись кто не готов воспринять язык 1С , мне лично тяжело понять такой текст так как не привык к типа "КонецЦикла" или "КонецФункции"и тд и тп ЗЫ А это жесть "Если ПозицияСкобкиЛевая"

Andrey: Dima пишет: А это жесть "Если ПозицияСкобкиЛевая"

PSP: Андрей, "ТСетевоеОкружение" - объект, содержащий таблицу. "Попытка" = "TRY" или "BEGIN SEQUENCE WITH" "Исключение" = "CATCH" или "RECOVER" "ПозицияСкобкиЛевая" - просто переменная.



полная версия страницы