You Receive an Error Message When You Change a Migrated Account Password (321327)



The information in this article applies to:

  • Microsoft Windows 2000 Server SP1
  • Microsoft Windows 2000 Server SP2
  • Microsoft Windows 2000 Advanced Server SP1
  • Microsoft Windows 2000 Advanced Server SP2

This article was previously published under Q321327

SYMPTOMS

If you use the Active Directory Users and Computers tool from the Windows 2000 Administration Tools on a Microsoft Windows XP-based client to change a user password for a migrated Novell NetWare user account, you may receive one of the following error messages, even though the password is actually changed:
Windows cannot complete the password change for Username because:

Insufficient access rights to perform the operation.

-or-

The system cannot find the file specified.

-or-

The specified module could not be found.
This problem may occur if no NetWare servers are available in the Windows 2000-based domain. It does not matter whether the NetWare servers are removed from the domain before or after the upgrade to Windows 2000.

CAUSE

An upgrade to Windows 2000 may automatically migrate some NetWare account attributes. Windows 2000 interprets these attributes as indicators that NetWare is included in the environment, and that the passwords must be synchronized. The error message occurs when you try to change the password on the nonexistent NetWare network (not on the Windows 2000-based domain) because the required NetWare components are not installed on the client.

For additional information about a related problem, click the article number below to view the article in the Microsoft Knowledge Base:

268709 "The Specified Module Could Not Be Found" Error Message Resetting Password w/NetWare-Enabled Account

RESOLUTION

To resolve this issue, you can clear the Active Directory user account userParameters property by using the sample script source that is included in the "More Information" section of this article.

You can also use the following command to remove the Netware configuration information from the userProperties property. Type Net user username /fpnw:no at a command line, where username is the logon name of the user who has the unwanted Netware configuration information in the userProperties property.

MORE INFORMATION

The IADSUser userParameters property is of the type CASE_IGNORE_STRING and may contain the following configuration items:
  • Migrated Novell NetWare user configuration information:

    NWPassword
    OldNWPassword
    MaxConnections
    NWPasswordSet
    GraceLoginAllowed
    GraceLoginRemaining
    NWLogonFrom NWHomeDir

  • Windows Terminal Services user configuration information:

    CtxCfgPresent
    CtxCfgFlags1
    CtxCallback
    CtxShadow
    CtxMaxConnectionTime
    CtxMaxDisconnectionTime
    CtxMaxIdleTime
    CtxKeyboardLayout
    CtxMinEncryptionLevel
    CtxWorkDirectory
    CtxNWLogonServer
    CtxWFHomeDir
    CtxWFHomeDirDrive
    CtxWFProfilePath
    CtxInitialProgram
    CtxCallbackNumber

  • Dial-up user configuration information
  • Custom properties that third-party programs may have added
Note that you can store and query the Terminal Services configuration information by using the WTSSetUserConfig and WTSQueryUserConfig Terminal Services API functions. These items are not stored unless you call the WTSSetUserConfig function. Windows does not call WTSSetUserConfig when a user logs on to a Terminal Services server. For additional information, visit and query the MSDN Web site.

Sample Script

'************************************************************************
'* File:     CLRPROP.VBS
'* Created:  April 9, 2002
'* Version:  1.0
'* Function: Clears the userParameters property value from all user
'*           accounts
'************************************************************************

'************************************************************************
'* Script options
'************************************************************************
OPTION EXPLICIT
On Error Resume Next
'************************************************************************
'* Constants
'************************************************************************
Const PROPERTY_NAME      = "userParameters"      ' the property to clear
Const CLASS_NAME         = "user"                ' the object type
Const LDAP_USERS         = "LDAP://CN=Users,DC=" ' the LDAP container
Const ADS_PROPERTY_CLEAR = 1                     ' for [IADs].PutEx
'************************************************************************
'* Variables
'************************************************************************
Dim Arguments     ' command line argument object
Dim DomainName    ' contains domain name argument string
Dim Container     ' (IADSContainer): the LDAP users container
Dim Child         ' (IADS,IADSUser,IADSPropertyList): the current user
Dim PropCount     ' from (IADSPropertyList)Child.PropertyCount
Dim PropIndex     ' index for PropCount
Dim Property      ' from Child.Item(PropIndex): (IADSPropertyEntry)
Dim Value         ' from (IADSPropertyEntry).Values
Dim NumValues     ' iterated count of Value
Dim NullValue     ' generic Null, a placeholder
Dim NumModified   ' iterated count of users to modify, and modified
Dim InfoText      ' string for display output
Dim NameList      ' string to hold list of user CN
Dim MsgReturn     ' return value for MsgBox
'************************************************************************
'* Command line handling
'************************************************************************
Set Arguments = WScript.Arguments
If Arguments.Count = 1 Then
   DomainName = Arguments(0)
   If Err <> 0 Then
      WScript.Echo "Error getting " & CMD_PARMS
      Wscript.Quit
   End If
Else
   InfoText = "Warning: No command line parameters" & Chr(13) & Chr(10)
   InfoText = InfoText & "Usage: " & Wscript.ScriptName & " <DOMAINNAME>"
   Wscript.Echo InfoText
   Wscript.Quit
End if
'************************************************************************
'* First object initialization
'************************************************************************
Set Container=GetObject(LDAP_USERS & DomainName)
If Err = 0 then
   '*********************************************************************
   '* Warn the user, and give a first-chance quit option
   '*********************************************************************
   InfoText = "Warning: This will clear the property '" & PROPERTY_NAME
   InfoText = InfoText & "' for all users in the domain " & DomainName
   InfoText = InfoText & "." & Chr(13) & Chr(10) & Chr(13) & Chr(10)
   InfoText = InfoText & "This includes Terminal Server settings set "
   InfoText = InfoText & "by using the WTSSetUserConfig API."
   InfoText = InfoText & Chr(13) & Chr(10) & Chr(13) & Chr(10)
   InfoText = InfoText & "Do you want to proceed?"
   MsgReturn = MsgBox(InfoText, vbYesNo, "Clear Property" )
   If MsgReturn = vbNo Then
      Wscript.Quit
   End If
   '*********************************************************************
   '* Walk the users, and determine how many have the property.
   '*********************************************************************
   NumModified = 0
   NameList = ""
   For Each Child in Container
      If StrComp( CLASS_NAME, Child.Class, 1 ) = 0 Then
         '***************************************************************
         '* Creates an instance of the IADSPropertyList
         '***************************************************************
         If Child.userParameters = Empty Then
            NullValue = Null
         End If
         Child.GetInfo
         PropCount = Child.PropertyCount
         For PropIndex = 0 To PropCount - 1
            Set Property = Child.Item(PropIndex)
            If StrComp( PROPERTY_NAME , Property.Name, 1 ) = 0 Then
               NumValues = 0
               For Each Value in Property.Values
                  NumValues = NumValues + 1
               Next
               If NumValues > 0 Then
                  NumModified = NumModified + 1
                  NameList = NameList & Child.Name & " "
               End If
            End If
         Next
      End If
   Next
   '*********************************************************************
   '* If none are found, report and quit
   '*********************************************************************
   If NumModified = 0 Then
      InfoText = "There are no users with the property '"
      InfoText = InfoText & PROPERTY_NAME & "'"
      WScript.Echo InfoText
      Wscript.Quit
   End If
   '*********************************************************************
   '* At least one was found; verify that the user wants to continue
   '*********************************************************************
   InfoText = "Do you want to clear the property '" & PROPERTY_NAME
   InfoText = InfoText & "' for the following " & CStr(NumModified)
   InfoText = InfoText & " users?" & Chr(13) & Chr(10)
   InfoText = InfoText  & Chr(13) & Chr(10) & NameList
   MsgReturn = MsgBox(InfoText, vbYesNo, "Clear Property" )
   If MsgReturn = vbNo Then
      Wscript.Quit
   End If
   '*********************************************************************
   '* Walk the users and clear the property
   '*********************************************************************
   InfoText = ""
   NameList = ""
   NumModified = 0
   For Each Child in Container
      If StrComp( CLASS_NAME, Child.Class, 1 ) = 0 Then
         '**************************************************************
         '* Create an instance of the IADSPropertyList
         '**************************************************************
         If Child.userParameters = Empty Then
            NullValue = Null
         End If
         PropCount = Child.PropertyCount
         For PropIndex = 0 To PropCount - 1
            Set Property = Child.Item(PropIndex)
            If StrComp( PROPERTY_NAME , Property.Name, 1 ) = 0 Then
               NumValues = 0
               For Each Value in Property.Values
                  NumValues = NumValues + 1
               Next
               If NumValues > 0 Then
                  NumModified = NumModified + 1
                  Child.PutEx ADS_PROPERTY_CLEAR, Property.Name, ""
                  Child.SetInfo
               End If
            End If
         Next
      End If
   Next
   '*********************************************************************
   '* Report that the task is complete
   '*********************************************************************
   InfoText = "Cleared property '" & PROPERTY_NAME & "' for "
   If NumModified = 0 Then
      InfoText = InfoText & "0 users"
   Else
      If NumModified = 1 Then
         InfoText = InfoText & "1 user"
      Else
         InfoText = InfoText & CStr(NumModified) & " users"
      End If
   End If
   WScript.Echo InfoText & Chr(13) & Chr(10) & NameList
Else
   '*********************************************************************
   '* General problem case
   '*********************************************************************
   WScript.Echo "Error getting object: " & LDAP_USERS & DomainName
End If
Wscript.Quit
				

Modification Type:MinorLast Reviewed:10/13/2004
Keywords:kberrmsg kbprb KB321327