Компьютерный форум 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=192669)

malkinfedor 30-11-2010 12:38 1554966

Определения членства в группах
 
Добрый день!
Вопрос такой - есть скрипт ниже, это HTA приложение которое встраивается в косноль mmc, в качестве параметра берет имя выделенного пользователя пред-windows2000 и по нему определяет в каких группах состоит этот юзер. Проблема в том что у нас в конторе имена пред-windows2000 имеют вид Фамилия Имя (Иванов Иван - пример). Этот же скрипт берет только первую часть имени до пробела, то есть Иванов, и естевственно не находит такого пользователя. Что нужно изменить что бы в качестве параметра принимось имя полностью.


Код:

<html>
<head>
<!--
Created with SAPIEN Technologies PrimalScript 2007

NAME: MemberOf_Report.HTA

AUTHOR: Dan Holme , Intelliem
DATE  : 12/16/2007

This HTA allows you to view the memberships of a user, group, or computer
See Solutions Collection 8, MemberOf_Report_V2.hta for an improved version

Neither Microsoft nor Intelliem guarantee the performance
of scripts, scripting examples or tools.

See www.intelliem.com/resourcekit for updates to this script

(c) 2007 Intelliem, Inc
-->
<title>Group Membership Report</title>
<hta:application
        id="oGroupMembershipReport">

<!-- Note this HTA can be called from a command line
        HTANAME.hta ObjectName
        Where
        HTANAME.hta is the filename of this HTA
        ObjectName is
                the Pre-Windows 2000 Logon Name, DN or ADsPath
                of a user, computer, or group -->
               
<script language="vbscript">

Option Explicit
Dim oMemberOfList
Dim sDomainDN
' CONFIGURATION BLOCK
sDomainDN = "dc=corp,dc=ertelecom,dc=loc"
Dim aArguments       

Sub Window_Onload
        Call CenterMe(250,500)
        aArguments = HTA_Arguments(oGroupMembershipReport)
        If uBound(aArguments) >= 0 Then
                ' An argument was passed to the HTA
                ' Prepopulate the text box and then run the main routine
                txtObjectDN.value = aArguments(0)
                Call MainRoutine()
        End If
End Sub

Sub MainRoutine()
        Dim aMemberOfList
        Dim sMemberOf
        Dim sResults
        Dim sObjectDN
       
        sObjectDN = ADObject_DN_UCG(txtObjectDN.value, sDomainDN)
        If sObjectDN = "" Then
                MsgBox "Could not find " & txtObjectDN.value
        End If
       
        ' Create dictionary object to store group names
        Set oMemberOfList = CreateObject("Scripting.Dictionary")
        ' Set comparison mode to case insensitive
        oMemberOfList.CompareMode = vbTextCompare
       
        Call ADObject_MemberOf (sObjectDN)
        aMemberOfList = oMemberOfList.Keys
        aMemberOfList = Array_Sort(aMemberOfList)
        sResults = "MEMBERSHIPS"
        For Each sMemberOf In aMemberOfList
                sResults = sResults & "<br/>" & sMemberOf
        Next
       
        divResults.innerHTML = sResults
End Sub

' ======================
' FUNCTIONS FROM LIBRARY
' ======================
Function ADObject_DN_UCG(ByVal sObject, sSearchDN)
        ' Version 070706
        ' Takes any input (name, DN, or ADsPath) of a user, computer, or group,
        ' and returns the distinguished name of the object
        ' INPUTS:        sObject: name, DN or ADsPath to a user, group, or computer
        '                        sSearchDN: the DN within which to search (often, the DN of the domain, e.g. dc=contoso, dc=com)
        ' RETURNS:        ADObject_DN_UCG: distinguished name (cn=...) of the object
        ' REQUIRES:        ADObject_Find_UCG routine
       
        Dim sObjectName, oObject, sObjectADsPath, sObjectDN
       
        If Len(sObject) = 0 Then
                sObjectDN = ""
        ElseIf Len(sObject) < 3 Then
                ' can't be a DN or an ADsPath - must be a name
                sObjectADsPath = ADObject_Find_UCG(sObject, sSearchDN)
                If sObjectADsPath <> "" Then sObjectDN = mid(sObjectADsPath,8)
        ElseIf LCase(Left(sObject,3)) = "cn=" Then
                ' is a DN - make sure it exists
                On Error Resume Next
                Set oObject = GetObject("LDAP://" & sObject)
                sObjectDN = oObject.distinguishedName
                If Err.Number <> 0 Then
                        ' Error - couldn't find object
                        sObjectDN = ""
                        Err.Clear
                End If
                On Error GoTo 0
        ElseIf Len(sObject) < 8 Then
                ' can't be an ADsPath and isn't a DN, must be a name
                sObjectADsPath = ADObject_Find_UCG(sObject, sSearchDN)
                If sObjectADsPath <> "" Then sObjectDN = mid(sObjectADsPath,8)
        ElseIf Ucase(Left(sObject, 7)) = "LDAP://" Then
                ' is an ADsPath - make sure it exists
                ' first, make sure LDAP:// is upper case, to avoid error
                sObject = "LDAP://" & Mid(sObject, 8)
                On Error Resume Next
                Set oObject = GetObject(sObject)
                sObjectDN = oObject.distinguishedName
                If Err.Number <> 0 Then
                        ' Error - couldn't find object
                        sObjectDN = ""
                        Err.Clear
                End If
                On Error GoTo 0
        Else
                ' must be a name
                sObjectADsPath = ADObject_Find_UCG(sObject, sSearchDN)
                If sObjectADsPath <> "" Then sObjectDN = mid(sObjectADsPath,8)
        End If

        ADObject_DN_UCG = sObjectDN

End Function

Function ADObject_Find_UCG(sObjectName, sSearchDN)
        ' VERSION 070706
        ' Returns the full ADsPath (LDAP://...) of a user, computer, or group
        ' Inputs:
        '                sObjectName: The unique identifier for the object class.  The script supports:
        '                        User:                sAMAccountName (pre-Windows 2000 logon name)
        '                        Group:                sAMAccountName (pre-Windows 2000 logon name)
        '                        Computer:        Name (translated by the script to the computer's sAMAccountName by adding a $)
        '                sSearchDN: the DN within which to search (often, the DN of the domain, e.g. dc=contoso, dc=com)

        Dim oConnection
        Dim oRecordset
        Dim sLDAPObjectQuery
        Dim sLDAPIdentifierQuery
        Dim sLDAPQuery
        Dim sProperties
        Dim oADObject
        Dim aProperties
        Dim sProperty
        Dim sLDAPIdentifier
        Dim sSearchScope
       
        sLDAPIdentifier = "samAccountName"
        sProperties = "ADsPath"
        sSearchScope = "subtree"
       
        ' Open an ADO connection using null credentials
        Set oConnection = CreateObject("ADODB.Connection")
        oConnection.Provider = "ADsDSOObject"
        'On Error Resume Next
        oConnection.Open "", vbNullString, vbNullString
        If oConnection.State = 0 Then ' 0 = adStateClosed
            ' Error handling code: can't connect to AD
            ADObject_Find_UCG = ""
            Exit Function
        End If
       
        ' Build the LDAP Query
        sLDAPQuery = "<LDAP://" & sSearchDN & ">;"
        sLDAPQuery = sLDAPQuery & _
                "(|(samAccountName=" & sObjectName & ")" & _
                "(samAccountName=" & sObjectName & "$));" & _
                sProperties & ";" & sSearchScope
       
        ' Retrieve the result set, close the connection, and check to make
        ' sure we received at least one result
        Set oRecordset = oConnection.Execute (sLDAPQuery)
        If oRecordset.EOF and oRecordset.BOF Then
                ' Error handling code: no object found
            ADObject_Find_UCG = ""
            Exit Function
        End If
       
        ADObject_Find_UCG = oRecordset.Fields("ADsPath")
        oRecordset.Close
        oConnection.Close
       
End Function

Sub ADObject_MemberOf(ByVal sObjectDN)
        ' Version 070701
        ' Enumerates the group memberships of a user or computer
        ' INPUTS:        sObjectDN: the DN of the user or computer
        ' RETURNS:        oMemberOfList sorted with each group
        '                        to which the user or computer belongs.
        ' REQUIRES:        ADObject_MemberOf_Enum function
        '                        Array_Sort function
        '                        oMemberOf List with global scope
        '                        e.g.
        '                        Set oMemberOfList = CreateObject("Scripting.Dictionary")
        '                        oMemberOfList.CompareMode = vbTextCompare ' Case INsensitive
       
        Dim oObject
        Dim iPrimaryGroup
        Dim sPrimaryGroup
        Dim aMemberOf
       
        On Error Resume Next
        Set oObject = GetObject("LDAP://" & sObjectDN)
        If Err.Number<>0 Or oObject Is Nothing Then
                Err.Clear
                Exit Sub
        End If
        On Error GoTo 0

        If oObject.Class = "computer" Or oObject.Class = "user" Then
                iPrimaryGroup = oObject.PrimaryGroupID
                sPrimaryGroup = ""
                Select Case iPrimaryGroup
                        Case 513
                                sPrimaryGroup = "Domain Users"
                        Case 514
                                sPrimaryGroup = "Domain Guests"
                        Case 515
                                sPrimaryGroup = "Domain Computers"
                        Case 516
                                sPrimaryGroup = "Domain Controllers"
                End Select
                If sPrimaryGroup > "" Then
                        Call ADObject_MemberOf_Enum(sPrimaryGroup)
                        oMemberOfList.Add sPrimaryGroup, True
                End If
        End If
       
        On Error Resume Next
        aMemberOf = oObject.GetEx("memberOf")
        If Err.Number <> 0 Then
                ' Assume error is because memberOf has no distinguished names
                Err.Clear
                On Error GoTo 0
                Exit Sub
        Else
                On Error GoTo 0
                Call ADObject_MemberOf_Enum(oObject)
        End If
               
End Sub

Sub ADObject_MemberOf_Enum(ByVal oObject)
    ' Version 070701
    ' Enumerates MemberOf property of an object
    ' INPUTS:        oObject: object for which to enumerate MemberOf
    ' REQUIRES:        oMemberOfList dictionary object with global scope
        '                        e.g.
        '                        Set oMemberOfList = CreateObject("Scripting.Dictionary")
        '                        oMemberOfList.CompareMode = vbTextCompare ' Case INsensitive
       
        Dim aMemberOf
        Dim sMemberOf
        Dim oMemberOf
        Dim sMemberOfSAM
       
        On Error Resume Next
        aMemberOf = oObject.GetEx("memberOf")
        If Err.Number <> 0 Then
                ' Assume error is because memberOf has no distinguished names
                Err.Clear
                On Error GoTo 0
                Exit Sub
        Else
                On Error GoTo 0
                For Each sMemberOf In aMemberOf
                        Set oMemberOf = GetObject("LDAP://" & sMemberOf)
                        sMemberOfSAM = oMemberOf.sAMAccountName
                        If (oMemberOfList.Exists(sMemberOfSAM) = False) Then
                                ' We have not seen this group yet
                                ' Add it to the dictionary object
                                oMemberOfList.Add sMemberOfSAM, True
                                ' Enumerate this group's nested memberships
                                Call ADObject_MemberOf_Enum(oMemberOf)
                        End If
            Next
        End If

End Sub

Function Array_Sort(ByVal aArray)
        ' VERSION 070701
        ' Sorts an array, very quickly, using .NET objects
        ' INPUTS:        aArray: an array (incl Dictionary object) requiring sort
        ' RETURNS:        Array_Sort: sorted
        ' REQUIRES:        .NET Framework 2.0
       
    Dim oNAL
    Dim nIdx
   
    Set oNAL = CreateObject("System.Collections.ArrayList")
    For nIdx = 0 To UBound(aArray)
        oNAL.Add aArray(nIdx)
    Next
   
    oNAL.Sort
   
    For nIdx = 0 To UBound(aArray)
        aArray(nIdx) = oNAL(nIdx)
    Next
   
    Array_Sort = aArray
   
End Function


Function HTA_Arguments(ByRef oHTA)
        ' Version 071127
        ' Interprets the command line used to call the HTA
        ' and creates an arguments collection.
        ' Inputs:        oHTA:        the HTA application object, as defined in the
        '                                        <hta:application id="xxxx" ...> id attribute
        '                                        (e.g. you would pass xxxx as the argument)
        '                        command line used to call this hta should use quotes
        '                        around the path/name of the HTA itself as well as
        '                        around each argument.
        '                        quotes embedded in arguments will mess it up, so don't
        '                        use any. For example:
        '                        [mshta.exe] "path\filename.hta" ["argument 1" ["argument 2" ...]]
        ' Outputs:        HTA_Arguments():        an array of arguments
        ' Requires:        Text_Delimited_Parse() function
       
        Dim aSplit, i, aArguments, sCommandLine
        sCommandLine = oHTA.commandline
        i = InStr(1, sCommandLine, ".hta", vbTextCompare)
        If i = 0 Then Exit Function
        i = InStr(i, sCommandLine, " ")
        If i = 0 OR Len(sCommandLine) = i Then
                HTA_Arguments = Split("",",")
                Exit Function
        End If
        sCommandLine = Mid(sCommandLine, i+1)
       
        HTA_Arguments = Text_Delimited_Parse(sCommandLine, " ", True)
       
End Function

Function Text_Delimited_Parse(ByVal sTextLine, ByVal sDelimiter, ByVal bTrim)
        ' Version 070708
        '
    ' Parse delimited text into its components (elements)
    ' and return an array of those elements
    '
    ' Allows for "qualified" elements
    '
    ' To embed a delimiter (e.g. a comma)
    ' surround the element with double-quotes
    ' e.g. "This is one, and only one, element"
    '
    ' To embed a quote, use a double-double quote
    ' e.g. "He said, ""This is one element."""
    ' would result in: He said, "This is one element."
    ' being treated as one element in the delimited text line
    '
    ' INPUTS:        sTextLine - a line of delimited text
    '                        sDelimiter - the delimiter (e.g. a comma)
    '                        bTrim - trim trailing and leading spaces
    ' RETURNS:        Text-Delimited_Parse() - an Array

    Dim aElements
    Dim bIgnore
    Dim bNewElement
    Dim iElementCount
    Dim iPosition
    Dim iStart
    Dim sChar
    Dim sValue
        Dim QUOTE
        Dim DOUBLEQUOTE
       
    QUOTE = Chr(34)
    DOUBLEQUOTE = QUOTE & QUOTE

    ' Check for empty string and return empty array.
    If bTrim then sTextLine = Trim(sTextLine)
    If (Len(sTextLine) = 0) then
        Text-Delimited_Parse = Array()
        Exit Function
    End If

    ' Initialize.
    bIgnore = False
    bNewElement = True
    iElementCount = 0
    iStart = 1
    aElements = Array()

    ' Add a delimiter to delimit the last element
    sTextLine = sTextLine & sDelimiter

    ' Process each character of text
    For iPosition = 1 To Len(sTextLine)
        sChar = Mid(sTextLine, iPosition, 1)
        Select Case sChar
            Case QUOTE
                ' Toggle the Ignore flag
                If bIgnore And Len(sTextLine) > iPosition Then
                        ' We're already "inside" the qualifier (quotes)
                        ' so check to see if this is a double quote
                        If Mid(sTextLine, iPosition+1, 1) = Quote Then
                                ' We have a double quote. Skip over it.
                                iPosition = iPosition + 1
                        Else
                                ' The next character is not a quote, so
                                ' Flip the ignore flag -- this is either the
                                ' beginning or the end of a quote-qualified item
                                bIgnore = Not bIgnore
                        End If
                Else
                        ' We're not "inside" a qualifier or
                        ' we're at the end of the string and have found a quote
                        bIgnore = Not bIgnore
                End If
            Case sDelimiter
                If Not bIgnore Then
                        ' We found a delimiter,
                        ' and we're not "inside" the qualifier (quotes)
                    ' So we add this element to the array.
                    ReDim Preserve aElements(iElementCount)
                    If iPosition - iStart = 0 Then
                                                ' The element is empty
                            aElements(iElementCount) = Empty
                    Else
                        ' Get the element
                        sValue = Mid(sTextLine, iStart, _
                            iPosition - iStart)
                        If bTrim then sValue = Trim (sValue)
                        ' If the element is qualified with quotes,
                        ' remove them and replace
                        ' double-double quotes with double-quotes
                        If (Left(sValue, 1) = QUOTE) Then
                                sValue = Mid(sValue, 2, Len(sValue) - 2)
                                sValue = Replace(sValue, DOUBLEQUOTE, QUOTE)
                        End If
                                                aElements(iElementCount) = sValue
                                                ' DEBUG: WScript.Echo ": " & sValue
                    End If
                    ' Prepare for next element
                    iElementCount = iElementCount + 1
                    iStart = iPosition + 1
                    bNewElement = True
                End If
                        Case " "
                                If bNewElement AND bTrim Then
                                        ' We're starting a new element and this is a leading space
                                        ' that should be trimmed
                                        iStart = iPosition + 1
                                End If
                        Case Else
                                ' Turn off the 'leading space' flag
                                bNewElement = False
        End Select
    Next
    Text_Delimited_Parse = aElements
End Function

Sub CenterMe(iSizeH, iSizeV)
                ' VERSION 070709
                ' Repositions the window to be centered and sized
                ' INPUTS:        iSizeH:        The desired horizontal size of the window
                '                        iSizeV:        The desired vertical size of the window
                ' NOTE:                Windows Server 2008 does not expose the
                '                        display resolution, by default, so the routine
                '                        will only size the window in the event that the
                '                        resolution is not available
               
                Dim sComputer, oWMIService, cItems, oItem
                Dim iResolutionH, iResolutionV, iPositionH, iPositionV
               
                ' Get this computer's display resolution
        sComputer = "."
        Set oWMIService = GetObject("winmgmts:\\" & sComputer & "\root\cimv2")
        Set cItems = oWMIService.ExecQuery("Select * From Win32_DesktopMonitor")
        For Each oItem in cItems
            iResolutionH = oItem.ScreenWidth
            iResolutionV = oItem.ScreenHeight
                ' Windows Server 2008 does not provide the ScreenHeight & ScreenWidth by default
                ' so, below, we have to provide for this possibility
        Next
       
        ' Calcultate the "centered" position
        iPositionH = (iResolutionH - iSizeH) / 2
        iPositionV = (iResolutionV - iSizeV) / 2
       
        ' Resize and reposition the window
        window.resizeTo iSizeH, iSizeV
        If iResolutionH >0 and iResolutionH > 0 Then
                window.moveTo iPositionH, iPositionV
        End If
       
End Sub

</script>

<style>
        body, tr, td, table, p, input {font-family: arial; font-size: 9pt;}
</style>

</head>
<body>
User, group or computer name:<br/>
<input type="text" name="txtObjectDN" id="txtObjectDN" size="20"  onchange="MainRoutine()"/>
<br/>
<input type="button" value="Report" id="btnGo" name="btnGo" onclick="MainRoutine()"/>
<h3>Group memberships</h3>
<div id="divResults" name="divResults">&nbsp;</div>
</body>
</html>

Спасибо!

vitaliyboch 21-12-2010 10:56 1571031

лично у меня работает как с пробелами, так и без. Специально переименовал одного тестового пользователя (вставил ему пробел в пред-windows2000) и проверил. Также и по русски обозвал тестового пользователя - тоже работает.
выполняю на компе с Windows 7
доменный контроллер на Windows Server 2003

vitaliyboch 22-12-2010 08:15 1571833

Быть может автор поста не исправил строчку с именем домена на свой домен?
Код:

' CONFIGURATION BLOCK
sDomainDN = "dc=corp,dc=ertelecom,dc=loc"



Время: 01:50.

Время: 01:50.
© OSzone.net 2001-