วิธีการใช้สคริปต์ Visual Basic เพื่อล้าง SidHistory

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 295758 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

สรุป

Microsoft Visual Basic สคริปต์ (VBScript) ให้ไว้ในบทความนี้จะค้นหาวัตถุตามชื่อในไดเรกทอรี และความพยายามที่ยกเลิกเลือก sidHistory สำหรับวัตถุนั้น มีพารามิเตอร์ที่ไม่จำเป็นสำหรับobjectClassและobjectCategoryเพื่อช่วยในการค้นหา

ข้อมูลเพิ่มเติม

เมื่อวัตถุผู้ใช้การย้ายจากโดเมนหนึ่งไปยังอีก ตัวระบุความปลอดภัยใหม่ (SID) ต้องถูกสร้างขึ้นสำหรับบัญชีผู้ใช้ และเก็บไว้ในนั้นSID ของวัตถุคุณสมบัติ ก่อนค่าใหม่ถูกเขียนไปยังคุณสมบัติ ค่าก่อนหน้านี้จะถูกคัดลอกไปยังคุณสมบัติอื่นของวัตถุผู้ใช้ประวัติของ SID(SIDHistory). คุณสมบัตินี้สามารถเก็บค่าหลายค่า แต่ละครั้งที่วัตถุผู้ใช้ย้ายไปยังโดเมนอื่น SID ที่ใหม่ถูกสร้างขึ้น และเก็บไว้ในนั้นSID ของวัตถุคุณสมบัติและค่าอื่นถูกเพิ่มเข้าไปในรายการของ SIDs เก่าในประวัติของ SID. ในบางครั้งคุณอาจจำเป็นเพื่อล้างSIDHistory.

รหัส VBScript ต่อไปนี้จะเอาออกแบบSIDHistoryแอตทริบิวต์จากวัตถุไดเรกทอรีที่ระบุในอาร์กิวเมนต์บรรทัดคำสั่ง
  1. เปิด Microsoft Notepad
  2. คัดลอกรหัสต่อไปนี้ และวางลงในเอกสารแผ่นจดบันทึกของคุณ
    Const ADS_PROPERTY_DELETE = 4
    
    Dim strFilter 'As String
    Dim oConnection 'As ADODB.Connection
    Dim oRecordSet 'As ADODB.RecordSet
    Dim strQuery 'As String
    Dim strDomainNC 'As String
    Dim oRootDSE 'As IADs
    Dim vArray 'As Variant()
    Dim vSid 'As Variant
    Dim oDirObject 'As Variant
    
    ' Parse the command line and set the query filter
    ParseCommandLine()
    
    ' Find the domain naming context
    set oRootDSE = GetObject("LDAP://RootDSE")
    strDomainNC = oRootDSE.Get("defaultNamingContext")
    set oRootDSE = Nothing
    
    ' Setup the ADO connection
    Set oConnection = CreateObject("ADODB.Connection")
    oConnection.Provider = "ADsDSOObject"
    oConnection.Open "ADs Provider"
    
    strQuery = "<LDAP://" & strDomainNC & ">;" & strFilter & ";distinguishedName,objectClass,name,sidHistory;subtree"
    
    'Execute the query
    set oRecordSet = oConnection.Execute(strQuery)
    if oRecordSet.Eof then
      WScript.Echo "No objects were found"
      WScript.Quit(0)
    Else
      Dim vClasses 'As Variant
      Dim strClass 'As String
    
      WScript.Echo "The following objects were found:"
    
      'On Error Resume Next
    
      ' Iterate through the objects that match the filter
      While Not oRecordset.Eof
         vClasses = oRecordset.Fields("objectClass").Value
         strClass = vClasses(UBound(vClasses))
         WScript.Echo "Name: " & oRecordset.Fields("name").Value & "   Class: " & strClass & "  DN: " & oRecordset.Fields("distinguishedName").Value
    
         If IsNull(oRecordSet.Fields("sIDHistory").Value ) Then
            WScript.Echo "This object does not have a sidHistory"
         Else
    	set oDirObject = GetObject("LDAP://" & oRecordset.Fields("distinguishedName").Value) 
            vArray = oDirObject.GetEx("sIDHistory")
            For Each vSid in vArray
             oDirObject.PutEx ADS_PROPERTY_DELETE, "sIDHistory", array(vSid) 
             oDirObject.SetInfo 
            Next
            WScript.Echo "The sidHistory has been cleared for this object!"
         End if
         
         oRecordset.MoveNext
      Wend
    End if
    
    'Clean up
    Set oRecordset = Nothing
    Set oConnection = Nothing
    
    '=========================================================================================================================
    ' The ParseCommandLine subroutine will build the query filter base on the arguments passed to the script.  The bNameFlag
    ' is used so that the name given can have spaces in it.
    '=========================================================================================================================
    Sub ParseCommandLine()
       Dim vArgs, Value, Equals, I
       Dim bNameFlag 'As Boolean
       Dim strName 'As String
       Dim strObjectCategory 'As String
       Dim strObjectClass 'As String
    
       Set vArgs = WScript.Arguments
       if VArgs.Count < 1 Then
          DisplayUsage()
       End if
    
      bNameFlag = False
      For I = 0 to vArgs.Count - 1
          If Left( vArgs(I) , 1 ) = "/" Or Left( vArgs(I) , 1 ) = "-" Then
    
             Value = ""
             Equals = InStr( vArgs(I) , "=" )
             If Equals = 0 Then Equals = InStr( vArgs(I) , ":" )
             If Equals > 0 Then Value = Mid( vArgs(I) , Equals + 1 )
    
             Select Case LCase( Mid( vArgs(I) , 2 , 1) )
    
       		Case "n" strName = Value
    			 bNameFlag = True  'This will allow us to catch spaces
       		Case "o" strObjectCategory = Value
    			 bNameFlag = False
                    Case "c" strObjectClass = Value
    			 bNameFlag = False
    		Case Else DisplayUsage
    
             End Select        	
    
         Else 'no dash or slash;  Check if we are giving a name
            if bNameFlag Then
               strName = strName & " " & vArgs(I)
            else
               DisplayUsage
            end if
         End if
       Next
    
    'Should be okay to build filter  
    
    If strName = "" Then
      WScript.Echo "A name parameter must be given"
      WScript.Quit(1)
    Else
      strFilter = "(&(name=" & strName & ")"
      If Len(strObjectCategory) > 0 Then
         strFilter = strFilter & "(objectCategory=" & strObjectCategory & ")"
      End if
      If Len(strObjectClass) > 0 Then
         strFilter = strFilter & "(objectClass=" & strObjectClass & ")"
      End if
    
      strFilter = strFilter & ")" 'Close filter
    End if
    End Sub
    
    '=========================================================================================================================
    ' The DisplayUsage subroutine will display how to use this script, the objectCategory and objectClass arguments are optional.
    '=========================================================================================================================
    Sub DisplayUsage()
     WScript.Echo "Usage csript.exe " & WScript.ScriptName & vbLF & _ 
         "-n=<name of the object you are looking for>" & vbLF & _
         "[-o=<objectCategory of the object you are looking for>]" & vbLF & _
         "[-c=<objectClass of the object you are looking for>]"  & vbLF & vbLF & _ 
    	 "Examples : " & vbLF & _
    	 WScript.ScriptName & " -n=My Contact" & vbLF & _
    	 WScript.ScriptName & " -n=Computer1 -o=computer" & vbLF & _ 
    	 WScript.ScriptName & " -n=James Smith -o=Person -c=user"
     WScript.Quit(0)
    
    End Sub
        
    					
  3. บันทึกเอกสารเป็น C:\ClearSidHistory.vbs
  4. เรียกใช้รหัส การใช้งานสำหรับ ClearSidHistory.vbs มีดังนี้:
    cscript.exe ClearSidHistory.vbs - n =<name></name>[-o =<objectcategory></objectcategory>] [-c=<objectclass></objectclass>]

    -n =<name of="" the="" object="" you="" are="" looking="" for=""></name>
    -o =<objectcategory of="" the="" object="" you="" are="" looking="" for=""></objectcategory>
    -c =<objectclass of="" the="" object="" you="" are="" looking="" for=""></objectclass>

    ตัวอย่าง:

    cscript.exe ClearSidHistory.vbs - n =ผู้ติดต่อของฉัน
    cscript.exe ClearSidHistory.vbs - n = Computer1 -o =คอมพิวเตอร์
    cscript.exe ClearSidHistory.vbs - n = Smith ถนน -o =บุคคล - c =ผู้ใช้

คุณสมบัติ

หมายเลขบทความ (Article ID): 295758 - รีวิวครั้งสุดท้าย: 8 มกราคม 2554 - Revision: 2.0
ใช้กับ
  • Microsoft Windows 2000 Server
Keywords: 
kb32bitonly kbhowto kbprb kbmt KB295758 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:295758

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com