<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS & ADSI: Контроль группы локальных админ-ов на станциях домена]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6002</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6002&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS & ADSI: Контроль группы локальных админ-ов на станциях домена».]]></description>
		<lastBuildDate>Fri, 15 Jul 2011 10:28:48 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS & ADSI: Контроль группы локальных админ-ов на станциях домена]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49876#p49876</link>
			<description><![CDATA[<p>Функция <span style="color: blue">LocalAdmins_AuditorEx()</span> - расширенная версия функции <span style="color: blue">LocalAdmins_Auditor()</span>.<br />Отличия от базовой:<br />- в группу локальных администраторов выполняется добавление &quot;учёток&quot;, присутствующих в контрольном списке, но отсутствующих в списке членов группы;<br />- перед подключением к SAM станции выполняется предварительная проверка доступности станции (вызов функции <span style="color: blue">Available()</span>);<br />- итоговая таблица дополнена двумя списками (для каждой станции): добавленных и не добавленных в результате какой-либо ошибки &quot;учёток&quot;.<br /></p><div class="codebox"><pre><code>Function LocalAdmins_AuditorEx(objBook, strAdmins)
Dim objWsNet, strDomain
Dim objTemp, strTemp, arrTemp, blnModify, strAdmins2, strListFull, intRes
Dim strListRemoved, strListNotRemoved, strListAdded, strListNotAdded
Dim objGroup, objMember

Set objWsNet = CreateObject(&quot;WScript.Network&quot;)
strDomain = objWsNet.UserDomain
Set objWsNet = Nothing
If Len(strAdmins) &gt; 0 Then
    blnModify = True
    strAdmins = Replace(strAdmins, &quot;Domain&quot;, strDomain, 1, -1, vbTextCompare)
Else
    blnModify = False
End If
On Error Resume Next
With objBook.Worksheets(1)
    For i = 2 To .Range(&quot;a1&quot;).CurrentRegion.Rows.Count
        strListFull = vbNullString: strListRemoved = vbNullString: strListNotRemoved = vbNullString
        strListAdded = vbNullString: strListNotAdded = vbNullString
        .Cells(i, 1).Activate
        strTemp = .Cells(i, 1).Value
        .Range(&quot;c&quot; &amp; i &amp; &quot;:f&quot; &amp; i).ClearContents
        If Available(strTemp) Then
            Set objGroup = GetObject(&quot;WinNT://&quot; &amp; strDomain &amp; &quot;/&quot; &amp; strTemp &amp; &quot;/Администраторы,group&quot;)
            If Err.Number &lt;&gt; 0 Then
                Err.Clear
                Set objGroup = GetObject(&quot;WinNT://&quot; &amp; strDomain &amp; &quot;/&quot; &amp; strTemp &amp; &quot;/Administrators,group&quot;)
                If Err.Number &lt;&gt; 0 Then
                    Err.Clear
                End If
            End If
            If Not objGroup Is Nothing Then
                If blnModify Then strAdmins2 = Replace(strAdmins, &quot;Local&quot;, strDomain &amp; &quot;/&quot; &amp; strTemp, 1, -1, vbTextCompare)
                For Each objMember In objGroup.Members
                    strTemp = Mid(objMember.ADsPath, 9) &amp; &quot;;&quot;
                    strListFull = strListFull &amp; strTemp
                    If blnModify Then
                        If InStr(1, strAdmins2, strTemp, vbTextCompare) = 0 Then
                            intRes = objGroup.Remove(objMember.ADsPath)
                            If intRes = 0 Then
                                strListRemoved = strListRemoved &amp; strTemp
                            Else
                                strListNotRemoved = strListNotRemoved  &amp; strTemp
                            End If
                        End If
                    End If                
                Next
                .Cells(i, 2).Value = Left(strListFull, Len(strListFull) - 1)
                If blnModify Then
                    arrTemp = Split(Left(strAdmins2, Len(strAdmins2) - 1), &quot;;&quot;)
                    For j = 0 To UBound(arrTemp)
                        If InStr(1, strListFull, arrTemp(j), vbtextCompare) = 0 Then
                            Set objTemp = GetObject(&quot;WinNT://&quot; &amp; arrTemp(j))
                            If Err.Number = 0 Then
                                intRes = objGroup.Add(&quot;WinNT://&quot; &amp; arrTemp(j))
                                If intRes = 0 Then
                                    strListAdded = strListAdded &amp; arrTemp(j) &amp;&quot;;&quot;
                                Else
                                    strListNotAdded = strListNotAdded &amp; arrTemp(j) &amp; &quot;;&quot;
                                End If
                                Set objTemp = Nothing
                            Else
                                strListNotAdded = strListNotAdded &amp; arrTemp(j) &amp; &quot; (не найден);&quot;
                                Err.Clear
                            End If
                        End If
                    Next
                    .Cells(i, 3).Value = Left(strListRemoved, Len(strListRemoved) - 1)
                    .Cells(i, 4).Value = Left(strListNotRemoved, Len(strListNotRemoved) - 1)
                    .Cells(i, 5).Value = Left(strListAdded, Len(strListAdded) - 1)
                    .Cells(i, 6).Value = Left(strListNotAdded, Len(strListNotAdded) - 1)
                End If
            Else
                .Cells(i, 2).Value = &quot;Ошибка подключения&quot;
            End If
        Else
            .Cells(i, 2).Value = &quot;Не отвечает или не существует&quot;
        End If
        Set objMember = Nothing
        Set objGroup = Nothing
    Next
    .Columns(&quot;b:f&quot;).AutoFit
End With
End Function

&#039;======

Function Available(strName)
Dim objWMI, objItem

Set objWMI = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}&quot;).ExecQuery(&quot;SELECT * FROM Win32_PingStatus WHERE Address=&#039;&quot; &amp; strName &amp; &quot;&#039;&quot;)
For Each objItem In objWMI
    If IsNull(objItem.StatusCode) Or objItem.StatusCode &lt;&gt; 0 Then
        Available = False
    Else
        Available = True
    End If
Next
Set objItem = Nothing
Set objWMI = Nothing
End Function</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Dmitrii)]]></author>
			<pubDate>Fri, 15 Jul 2011 10:28:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49876#p49876</guid>
		</item>
		<item>
			<title><![CDATA[VBS & ADSI: Контроль группы локальных админ-ов на станциях домена]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49831#p49831</link>
			<description><![CDATA[<p>Назначение: Контроль группы локальных администраторов для заданного списка станций домена.<br />Описание:<br />1. Источники данных - две рабочие книги Excel.<br />1.1. Первая - со списком проверяемых компьютеров, вторая - со списком допустимых &quot;учёток&quot; локальных администраторов.<br />1.2. Компьютеры представлены их NetBIOS-именами.<br />&nbsp; &nbsp; &nbsp;Список располагается на первом рабочем листе книги, в первой колонке листа, начиная со второй строки<br />&nbsp; &nbsp; &nbsp;(первая строка содержит шапку таблицы). В каждой ячейке - имя только одного компьютера.<br />&nbsp; &nbsp; &nbsp;Вторая - четвёртая колонки предназначены для отражения результатов работы сценария:<br />&nbsp; &nbsp; &nbsp;- список обнаруженных &quot;учёток&quot; администраторов;<br />&nbsp; &nbsp; &nbsp;- список удалённых &quot;учёток&quot; администраторов;<br />&nbsp; &nbsp; &nbsp;- список &quot;учёток&quot; администраторов, которые должны были быть удалены, но не удалены из-за возникшей<br />&nbsp; &nbsp; &nbsp; &nbsp;при выполнении данной операции ошибки.<br />1.3. Допустимые &quot;учётки&quot; локальных администраторов предствалены строками в формате ПРЕФИКС + &quot;/&quot; + ИМЯ,<br />&nbsp; &nbsp; &nbsp;где ПРЕФИКС - строка, обозначающая тип &quot;учётки&quot;: Domain - для доменной, Local - для локальной.<br />&nbsp; &nbsp; &nbsp;Например:<br />&nbsp; &nbsp; &nbsp;- Domain/Администраторы домена<br />&nbsp; &nbsp; &nbsp;- Local/Администратор<br />&nbsp; &nbsp; &nbsp;Список располагается на первом рабочем листе книги, в первой колонке листа, начиная со второй строки<br />&nbsp; &nbsp; &nbsp;(первая строка содержит шапку). В каждой ячейке - только одна &quot;учётка&quot;.<br />1.4. Кавычки в списках нигде не используются.<br />2. В том случае, когда книга со списком допустимых &quot;учёток&quot; локальных администраторов не указана,<br />&nbsp; &nbsp;будет выполняться просмотр состава групп без его корректировки.<br />3. Сценарий ориентирован на работу в графическом режиме.<br /></p><div class="codebox"><pre><code>Dim objShell, strBaseFolder
Dim objDialog, intRes, strBookComputers, strAdminsList
Dim objExcel, objWB

Set objShell = CreateObject(&quot;Shell.Application&quot;)
strBaseFolder = objShell.NameSpace(&amp;H5).Self.Path
Set objShell = Nothing
MsgBox &quot;Укажите файл книги EXCEL со списком проверяемых компьютеров.&quot;, vbQuestion, &quot;Контроль группы локальных администраторов&quot;
Set objDialog = CreateObject(&quot;UserAccounts.CommonDialog&quot;)
objDialog.Filter = &quot;Книга MS Excel 97-2003 (*.xls)|*.xls|Книга MS Excel 2007 (*.xlsx)|*.xlsx&quot;
objDialog.FilterIndex = 1
objDialog.InitialDir = strBaseFolder
intRes = objDialog.ShowOpen
If intRes &lt;&gt; 0 Then
    strBookComputers = objDialog.FileName
    Set objExcel = CreateObject(&quot;Excel.Application&quot;)
    strAdminsList = vbNullString
    intRes = 0
    MsgBox &quot;Укажите файл книги EXCEL с допустимым списком локальных администраторов.&quot;, vbQuestion, &quot;Контроль группы локальных администраторов&quot;
    Set objDialog = CreateObject(&quot;UserAccounts.CommonDialog&quot;)
    objDialog.Filter = &quot;Книга MS Excel 97-2003 (*.xls)|*.xls|Книга MS Excel 2007 (*.xlsx)|*.xlsx&quot;
    objDialog.FilterIndex = 1
    objDialog.InitialDir = strBaseFolder
    intRes = objDialog.ShowOpen
    If intRes &lt;&gt; 0 Then
        strTemp = objDialog.FileName
        Set objWB = objExcel.Workbooks.Open(strTemp)
        For i = 2 To objWB.Worksheets(1).Range(&quot;a1&quot;).CurrentRegion.Rows.Count
            strAdminsList = strAdminsList &amp; objWB.Worksheets(1).Cells(i, 1).Value &amp; &quot;;&quot;
        Next
        objWB.Close
    Else
        MsgBox &quot;Файл книги EXCEL с допустимым списком локальных администраторов не выбран.&quot; &amp; vbNewLine &amp; _
                &quot;Очистка списка от недопустимых записей выполняться не будет.&quot;, vbExclamation, &quot;Контроль группы локальных администраторов&quot;
    End If
    Set objWB = objExcel.Workbooks.Open(strBookComputers)
    objExcel.Visible = True
    Call LocalAdmins_Auditor(objWB, strAdminsList)
    objWB.Save
    objWB.Close
    objExcel.Quit
    Set objWB = Nothing
    Set objExcel = Nothing
    MsgBox &quot;Готово.&quot;, vbInformation, &quot;Контроль группы локальных администраторов&quot;
Else
    MsgBox &quot;Файл книги EXCEL со списком проверяемых компьютеров не выбран.&quot;, vbCritical, &quot;Контроль группы локальных администраторов&quot;
End If
Set objDialog = Nothing
Wscript.Quit 0

&#039;======

Function LocalAdmins_Auditor(objBook, strAdmins)
Dim objWsNet, strDomain, strTemp, blnClear
Dim strAdmins2, strListFull, strListRemoved, strListNotRemoved
Dim objGroup, objMember, intRes

Set objWsNet = CreateObject(&quot;WScript.Network&quot;)
strDomain = objWsNet.UserDomain
Set objWsNet = Nothing
If Len(strAdmins) &gt; 0 Then
    &#039;MsgBox &quot;Вызвано для просмотра и очистки.&quot;
    blnClear = True
    strAdmins = Replace(strAdmins, &quot;Domain&quot;, strDomain, 1, -1, vbTextCompare)
Else
    &#039;MsgBox &quot;Вызвано только для просмотра.&quot;
    blnClear = False
End If
On Error Resume Next
With objBook.Worksheets(1)
    For i = 2 To .Range(&quot;a1&quot;).CurrentRegion.Rows.Count
        strListFull = vbNullString: strListRemoved = vbNullString: strListNotRemoved = vbNullString
        .Cells(i, 1).Activate
        strTemp = .Cells(i, 1).Value
        Set objGroup = GetObject(&quot;WinNT://&quot; &amp; strDomain &amp; &quot;/&quot; &amp; strTemp &amp; &quot;/Администраторы,group&quot;)
        If Err.Number &lt;&gt; 0 Then
            Err.Clear
            Set objGroup = GetObject(&quot;WinNT://&quot; &amp; strDomain &amp; &quot;/&quot; &amp; strTemp &amp; &quot;/Administrators,group&quot;)
            If Err.Number &lt;&gt; 0 Then
                Err.Clear
            End If
        End If
        If Not objGroup Is Nothing Then
            If blnClear Then strAdmins2 = Replace(strAdmins, &quot;Local&quot;, strDomain &amp; &quot;/&quot; &amp; strTemp, 1, -1, vbTextCompare)
            For Each objMember In objGroup.Members
                strTemp = Mid(objMember.ADsPath, 9) &amp; &quot;;&quot;
                strListFull = strListFull &amp; strTemp
                If blnClear Then
                    If InStr(1, strAdmins2, strTemp, vbTextCompare) = 0 Then
                        intRes = objGroup.Remove(objMember.ADsPath)
                        If intRes = 0 Then
                            strListRemoved = strListRemoved &amp; strTemp
                        Else
                            strListNotRemoved = strListNotRemoved  &amp; strTemp
                        End If
                    End If
                End If                
            Next
            .Cells(i, 2).Value = Left(strListFull, Len(strListFull) - 1)
            If blnClear Then
                .Cells(i, 3).Value = Left(strListRemoved, Len(strListRemoved) - 1)
                .Cells(i, 4).Value = Left(strListNotRemoved, Len(strListNotRemoved) - 1)
            End If
        Else
            .Cells(i, 2).Value = &quot;Ошибка подключения&quot;
            .Range(&quot;c&quot; &amp; i &amp; &quot;:d&quot; &amp; i).ClearContents
        End If
        Set objMember = Nothing
        Set objGroup = Nothing
        .Columns(&quot;b:d&quot;).AutoFit
    Next
End With
End Function</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Dmitrii)]]></author>
			<pubDate>Wed, 13 Jul 2011 12:00:24 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49831#p49831</guid>
		</item>
	</channel>
</rss>
