Ru-Board.club
← Вернуться в раздел «В помощь системному администратору»

» Автоматизация администрирования

Автор: urel
Дата сообщения: 26.10.2006 13:35
Bugriy
потому что Win32_ComputerSystem это клас, а тебе нужен обьект/обьекты, хотя он и всеравно там должен быть один =) достает обьекты запров вида
select * from Win32_ComputerSystem
возьми http://www.ks-soft.net/hostmon.eng/wmi/index.htm да посмотри

Добавлено:
те ты пытаешся применить метод к класу
Автор: Bugriy
Дата сообщения: 26.10.2006 14:11
urel

Заменил на:

var rc, objComputer;

objWMIComputerSystem=GetObject("winmgmts://"+strComputer+"/root/cimv2:Win32_ComputerSystem");

for (objComputer in objWMIComputerSystem)

{
rc = objComputer.Rename(strNewComputer,strDomainPasswd,strDomainUser);
}

if (rc != 0)
{WScript.Echo ("Rename failed with error: " + rc)};
else
{WScript.Echo ("Successfully renamed " + strComputer + " to " + strNewComputer)};

Скрипт отрабатывает и выводит Rename failed with error: undefined.
Автор: urel
Дата сообщения: 26.10.2006 14:27
Bugriy
попробуй заменить
objWMIComputerSystem=GetObject("winmgmts://"+strComputer+"/root/cimv2:Win32_ComputerSystem")
на objWMIComputerSystem=GetObject("winmgmts://"+strComputer+"/root/cimv2:Win32_ComputerSystem").ExecQuery("Select * from Win32_ComputerSystem")
или
objWMIComputerSystem=GetObject("winmgmts://"+strComputer+"/root/cimv2:Win32_ComputerSystem").InstancesOf("Win32_ComputerSystem")
Автор: Bugriy
Дата сообщения: 26.10.2006 14:43
urel
Ни то ни другое не срабатывает. Пишет - объект не поддерживает данный метод или свойство.

А разве цикл for in не должен все элементы класса перечислять даже без ExecQuery?
Автор: urel
Дата сообщения: 26.10.2006 15:33
Bugriy
потомучто нужно так, и что характерно так работает =)

colComputers = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2").InstancesOf("Win32_ComputerSystem")

Добавлено:
подключаешся к WMI (а тут можно подключаться сразу к класу?)
GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
выбираеш клас
InstancesOf("Win32_ComputerSystem")
Автор: Bugriy
Дата сообщения: 27.10.2006 09:07
urel

В vbs это может и работает. У меня скрипт на js. Ругается на эту строку.
Ошибка 0x80041021
код 80041021
Источник (null)

Вот так эта строка у меня выглядит:

objWMIComputerSystem=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" + strComputer + "\root\cimv2").InstancesOf("Win32_ComputerSystem");
Автор: Sk1f
Дата сообщения: 27.10.2006 11:12
Скрипт извлекает все записи из AD в заданной OU.

Цитата:

Option Explicit ' is used to force the scripter to declare variables
On Error Resume Next ' is used to tell vbscript to go to the next line if it encounters an Error

' Dim is used to declare varable names that are used in the script
Dim oQuery ' holds query to Execute
Dim objConnection ' makes connection to active directory
Dim objCommand ' the command executes the query
Dim objRecordSet ' holds the data returned from the query

oQuery = "<LDAP://ou=Пользователи,dc=test,dc=test>;;name;subtree"
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"

Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection

objCommand.CommandText = oQuery

Set objRecordSet = objCommand.Execute

While Not objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("name")
objRecordSet.MoveNext
Wend

objConnection.Close


Только получается, что они извлекает все подряд - и извлекает названия пользователей, но не объекты, названия ou, группы. Мне нужно чтобы он извлек пользователей(желательно как объекты) ну или извлек имя пользователя и dn (DistinguishedName).

Можно делать перебором всех ou и тогда я буду получать всю необходимую мне информацию - DistinguishedName, Name и тд. , но с помощью этого скрипта можно оптимизировать код на много строк кода.

Автор: jONES1979
Дата сообщения: 27.10.2006 13:24
Sk1f


Цитата:
Только получается, что они извлекает все подряд - и извлекает названия пользователей, но не объекты, названия ou, группы. Мне нужно чтобы он извлек пользователей(желательно как объекты) ну или извлек имя пользователя и dn (DistinguishedName).


oQuery = "<LDAP://ou=Пользователи,dc=test,dc=test>;;name;subtree"

смотри справку в ADSI SDK:

В запросе ты используешь LDAP-диалект:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/ldap_dialect.asp

Соответсвенно тебе нужно настроить фильтр:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/search_filter_syntax.asp
Автор: Bugriy
Дата сообщения: 27.10.2006 13:44
Хочу из скрипта на js запустить скрипт на vbs. Как мне передать именованные параметры скрипту на vbs и как вернуть результат (успех/ошибка) скрипту на js?

Добавлено:
Как передать параметры я понял.

WSHShell = WScript.CreateObject("WScript.Shell");
WSHShell.Run("script.vbs /par1:Par1",5);

Выход из vbs скрипта осуществляется с помощью:

WScript.Quit ErrorLevel;

Как узнать в исходном скрипте что запускаемый скрипт завершился с кодом ErrorLever? Если запускать его так:

Err=WSHShell.Run("script.vbs /par1:Par1",5);

то Err всегда равно нулю.
Автор: Refugee
Дата сообщения: 28.10.2006 00:18
Bugriy
запускай так: err=WSHShell.Run("script.vbs /par1:Par1",5,true);
кстати, скрипты на разных языках можно в один .wsf файл собрать, там и аналог include есть.
Автор: Bugriy
Дата сообщения: 30.10.2006 09:15
Refugee
Да, заработало.
Где можно почитать про эти параметры и вообще про функции win api?
Автор: Refugee
Дата сообщения: 30.10.2006 14:22
Bugriy
В msdn, если английский можешь читать
Автор: Oceanforce
Дата сообщения: 30.10.2006 14:34
Каким образом можно добавить список баннеров в winRoute,чтобы он изначально резал их на шлюзе? Может существует уже готовый скрипт для этого?
Автор: strizhakovs
Дата сообщения: 30.10.2006 15:30
Люди помгите, есть такая задача - организуется глобальный переезд фаил сервера, перед этим нужно определить пермишенс для папок, которые находятся на сетевом диске (фаил сервере).
А потом после переноса установить эти пермишенсы на новом сервере.
Подскажите, как используя VBScript получить данные о пермишенсах папок на сетевом диске???
ХЕЛП!!!!!
Автор: Bugriy
Дата сообщения: 30.10.2006 17:17
strizhakovs
Сделать бэкап папок со старого сервера и заресторить их на новый не проще ли?
Автор: strizhakovs
Дата сообщения: 30.10.2006 17:33
может и проще, но используя эту миграцию, нужно еще проонализировать, полученную инфу, понять у кого нужно убрать, кому добавить права и потом использую +- аналогичный скрипт назначить их сново...
Автор: BorlandIMHO
Дата сообщения: 30.10.2006 19:26

Цитата:
нужно определить пермишенс для папок, которые находятся на сетевом диске (фаил сервере).
А потом после переноса установить эти пермишенсы на новом сервере.

Между прочим, можно просто перенести все папки вместе с пермишнами...
Например, в FAR manager для этого достаточно при копировании/переносе (F5/F6) установить флаг "копировать права доступа"... И не нужно ничего никуда сохранять а потом восстанавливать...
Единственное ограничение - если сетка без доменов, то этот номер не пройдёт... Оба сервера должны быть в одном домене и пермишны должны быть именно для доменных пользователей...
Автор: strizhakovs
Дата сообщения: 30.10.2006 20:07
Это все понятно, но сейчас там очень сложная и глубокая структура котологов и ее нужно полюбому перелопачивать и упрощать....
Поэтому нужен такой скрипт...я уже весь инет перерыл...пока без результатно
Автор: jONES1979
Дата сообщения: 30.10.2006 20:21
strizhakovs
всё реально вплоть до файлов, но пиши подробнее, как ты хочешь это видеть, имхо ты "утонешь" в информации
думаю, смогу помочь
Автор: strizhakovs
Дата сообщения: 30.10.2006 20:46
Я вижу это следующим образом, скрипт, скорее всего будет засунут в эксель, но это не принципиально, а вот результат работы его(инфа) точно будет в экселе.
На фаил сервере всего 10 основных папок, соотвественно в экселе будет 10 листов для каждой из папок(можно коректировать скрипт и запускать его 10 раз )
в листе будет 3 столбца:
-первый, путь к папке (например \\mlfl01\IT\..\.)
-второй, название группы или юзера, который имеет туда доступ
-третий, описание дустапа (F- full; M - modifu; R -read)
Если групп или юзеров несколько, то будет несколько строк, в которых первый столбец не меняется. Как с верхней папкой закончили, скрипт переходит на уровень ниже, проверяет, есть ли там под папки, если да, то тестит их, ну и так далее....
Вот вообщем то моя идея....
Соответсвенно после получения и обработки этой информации можно будет использовать скрипт который будет назначать пермишенсы, использую эту (переработанную в ручную) инфу..
Ну вообщем то вот....
Автор: Sk1f
Дата сообщения: 31.10.2006 12:22
!
Автор: urel
Дата сообщения: 31.10.2006 16:32
strizhakovs
попробуй hттp://www.sysinternals.com/Utilities/AccessEnum.html
Автор: strizhakovs
Дата сообщения: 31.10.2006 18:04

Цитата:
попробуй hттp://www.sysinternals.com/Utilities/AccessEnum.html


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


Жду помощи jONES1979....
Автор: jONES1979
Дата сообщения: 31.10.2006 19:46
strizhakovs В процессе. Хотя трудности уже возникли.

Обращение чеwmi WMI возращает данные эээ.. непонятного типа( жаль исходник остался на работе), класс Win32_SecurityDescriptor содержит массив DACL типа "Win32_ACE array", и пока непонятно как его обработать пустой... И не понятно, пустой ли он вообще...

Второй вариант получать информацию через ADSI, принцип тот же, тока объекты, поля и методы другие. Этим пока не занимался

Автор: strizhakovs
Дата сообщения: 31.10.2006 20:04

Цитата:
Обращение чеwmi WMI возращает данные эээ.. непонятного типа( жаль исходник остался на работе), класс Win32_SecurityDescriptor содержит массив DACL типа "Win32_ACE array", и пока непонятно как его обработать пустой... И не понятно, пустой ли он вообще...

Второй вариант получать информацию через ADSI, принцип тот же, тока объекты, поля и методы другие. Этим пока не занимался


Слушай, а если сделать вот как.
Данные получить при помощи проги которая указана выше, потом их какнить загнать в эксель(это дело техники). А потом использовать вот этот скрипт:
из статьи http://searchwincomputing.techtarget.com/originalContent/0,289142,sid68_gci1190497,00.html

Цитата:
Option Explicit
Dim oFSO, oExcel, oSheet, sUser, iRow
iRow = 2
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oExcel = CreateObject("Excel.Application") Set oSheet = oExcel.Workbooks.Open("C:scriptsusernames.xls")

Do Until oExcel.Cells(iRow,1).Value= ""
sUser=oExcel.Cells(iRow,1).Value
iRow = iRow+1
Loop
oExcel.Quit

Call HomeDir()
Wscript.Quit

Sub HomeDir()
sHome = "C:scriptshome"
sHomeDir = sHome&sUser
If oFSO.FolderExists(sHomeDir) Then
Set oFolder = oFSO.GetFolder(sHomeDir)
WScript.Echo sHomeDir&"'s home directory already exists."
Else
oFSO.CreateFolder(sHomeDir)
Set oShell = Wscript.CreateObject(Wscript.Shell)
oShell.Run("%COMSPEC% /c cacls Echo Y| "& sHomeDir & " /t /c /g Administrators:F "& sUser & ":F", 2, True) End If End Sub

только у меня он так и не зарботал ругается на на выхов CACL. может у тебя получится разобраться.
Этот скрипт почти готовое решение, основываясь на данных экселя создавать папки.
Автор: jONES1979
Дата сообщения: 31.10.2006 20:06
... кстати, получаемая в итоге структура выглядит так:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_ace.asp

Для каждого пользователя, для выбранного каталога, биты либо установлены, либо нет:

FILE_ALL_ACCESS,
FOLDER_ADD_SUBDIRECTORY,
FILE_DELETE,
FILE_DELETE_CHILD,
FOLDER_TRAVERSE,
FILE_READ_ATTRIBUTES,
FILE_READ_CONTROL,
FOLDER_LIST_DIRECTORY, FILE_READ_EA, FILE_SYNCHRONIZE
FILE_WRITE_ATTRIBUTES,
FILE_WRITE_DAC,
FOLDER_ADD_FILE,
FILE_WRITE_EA,
FILE_WRITE_OWNER

соответственно тебе надо будет самому преобразовать
в удобочитаемые FULL, READ и WRITE ...Ну тоесть разработать критерий

Добавлено:
ага,.. если тебе надо пермишинсы потом раздавать, то выходит предыдущий мой пост лишний

Добавлено:
то есть не предыдущий, а ЭТОТ ))
Автор: strizhakovs
Дата сообщения: 31.10.2006 20:25
Не лишний а очень даже полезный, но проблемма в том что тот скрипт который я привел не работает (((
Пишит ошибку в этой строке:
oShell.Run("%COMSPEC% /c cacls Echo Y| "& sHomeDir & " /t /c /g Administrators:F "& sUser & ":F", 2, True)
Error: cannot use parentheses when calling a Sub
Code: 800A0414


Добавлено:
jONES1979 и если можешь за пости тот скрипт который ты написал...


Добавлено:
Вообщем прога, которую предложил urel не совсем коректно работает, они отображает не все подпапки, как устанавливать пермишенсы я разобрался (кому надо могу показать на примере). осталось соорудить скрипт который получит инфу о текущих пермишенсах на все папки и подпапки, jONES1979 твоя помощь еще ой как актуальна!!!


Добавлено:

Цитата:
Не лишний а очень даже полезный, но проблемма в том что тот скрипт который я привел не работает (((
Пишит ошибку в этой строке:
oShell.Run("%COMSPEC% /c cacls Echo Y| "& sHomeDir & " /t /c /g Administrators:F "& sUser & ":F", 2, True)
Error: cannot use parentheses when calling a Sub
Code: 800A0414

С этой ошибкой разобрался! правильно будет вот так:
objShell.Run("%COMSPEC% /c Echo Y| cacls " & strHomeFolder & " /t /c /g user:F", 2, True)

Вопрос теперь вот в чем, теоретически этаже команда(CACLS-Modify Discretionary Access Control Lists) выдает кому и какие права даны, для этого нужно зайти в командную строку и просто набрать cacls strHomeFolder (например: cacls c:\test) и он выдаст всех юзеров и группы у кого есть доступ на эту папку и какой доступ. Вот собственно проблема в том как тот результат который выдается после работы программы в cmd получить в скрипте и присвоить этот результат переменным???т.е. насколько я понимаю строка выглядет вот так:
objShell.Run("%COMSPEC% Echo Y| cacls " & strHomeFolder, 2, True)
но как теперь вытащить результат работы этой строки?
Автор: Sk1f
Дата сообщения: 01.11.2006 09:19
Как организовать проверку на существование папок?


Цитата:
Для чего это нужно?


Задача такая - я вбиваю ФИО человека в InputBox. Далее происходит проверка на существовании данного человека в AD. Если существует, то идет создание для него папки (\Управление Бухгалтерия\ Отдел Бухгалтерия\Folder Иванов Иван Иванович) и раздача прав на доступ к этой папке. Усложняется задача тем, что допустим был создан новый отдел и мы запускаем этот же скрипт, но тогда кроме создании папки для пользователя нужно, чтобы создавалась папка для отдела.

Автор: strizhakovs
Дата сообщения: 01.11.2006 09:28

Цитата:
Задача такая - я вбиваю ФИО человека в InputBox. Далее происходит проверка на существовании данного человека в AD. Если существует, то идет создание для него папки (\Управление Бухгалтерия\ Отдел Бухгалтерия\Folder Иванов Иван Иванович) и раздача прав на доступ к этой папке. Усложняется задача тем, что допустим был создан новый отдел и мы запускаем этот же скрипт, но тогда кроме создании папки для пользователя нужно, чтобы создавалась папка для отдела.


Этот пример тебе поможет:

Цитата:

Option Explicit
Dim intRow, objExcel, objSheet, strPathExcel
Dim strHomeFolder, strHome, strUser
Dim objFSO, objShell, intRunError

' Note you will have to amend the following variables
strHome = "\\grand\home\"
strPathExcel = "E:\Scripts\newUsers.xls"
intRow = 3 ' Row 1 contains headings

' Open the Excel spreadsheet
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objExcel = CreateObject("Excel.Application")
Set objSheet = objExcel.Workbooks.Open(strPathExcel)

' Create a shell for cmd and CACLS
Set objShell = CreateObject("Wscript.Shell")

' Here is the loop that cycles through the cells
Do Until (objExcel.Cells(intRow,1).Value) = ""
strUser = objExcel.Cells(intRow, 1).Value
call HomeDir ' I decided to use a subroutine
intRow = intRow + 1
Loop
objExcel.Quit ' Clears up Excel


Sub HomeDir()
strHomeFolder = strHome & strUser
If strHomeFolder <> "" Then
If Not objFSO.FolderExists(strHomeFolder) Then
On Error Resume Next
objFSO.CreateFolder strHomeFolder
If Err.Number <> 0 Then
On Error GoTo 0
Wscript.Echo "Cannot create: " & strHomeFolder
End If
On Error GoTo 0
End If
If objFSO.FolderExists(strHomeFolder) Then
' Assign user permission to home folder.
intRunError = objShell.Run("%COMSPEC% /c Echo Y| cacls "_
& strHomeFolder & " /t /c /g Administrators:f "_
& strUser & ":F", 2, True)
If intRunError <> 0 Then
Wscript.Echo "Error assigning permissions for user " _
& strUser & " to home folder " & strHomeFolder
End If
End If
End If
End Sub
objExcel.Quit

WScript.Quit

' End of Cacls example VBScript


Автор: jONES1979
Дата сообщения: 01.11.2006 09:34
Sk1f

Цитата:
Как организовать проверку на существование папок?



Код:
Set objFSO = CreateObject("Scripting.FileSystemObject")

sPath = "z:\Управление Бухгалтерия\ Отдел Бухгалтерия"
If Not objFSO.FolderExists(sPath) Then objFSO.CreateFolder(sPath)

sPath = sPath +"\Folder Иванов Иван Иванович"
If Not objFSO.FolderExists(sPath) Then objFSO.CreateFolder(sPath)

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Зеркалирование дисков Win2000


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.