[gptalk] Re: New Twist on old problem - Script set to wait on network - but inside script network names not resolved

  • From: "Nelson, Jamie" <Jamie.Nelson@xxxxxxx>
  • To: <gptalk@xxxxxxxxxxxxx>
  • Date: Thu, 20 Nov 2008 16:25:26 -0600

Another option would be to use a loop and keep checking for the
existence of the network share before you map it. However, you would
want to be careful here so that you don't go into in endless loop. I
would set a limit on the number of times it tries-maybe a max of 10
tries with 2-3 second sleep intervals between attempts.

 

//Code Start

 

Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")

Dim wsn : Set wsn = CreateObject("WScript.Network")

 

MapDrive "Z:", \\myserver\myshare, 5)

 

'----------

Function MapDrive(strDriveLetter, strPath, intNumTries)

'----------

 

For i = 0 To intNumTries

     If fso.FolderExists(strPath) Then

           wsn.MapNetworkDrive strDriveLetter, strPath, True

           MapDrive = True

Exit For

     Else

           MapDrive = False

           WScript.Sleep 3000

End If

Next

 

End Function

 

//Code End

 

Regards,

 

Jamie Nelson | Operations Consultant | BI&T Infrastructure-Intel | Devon
Energy Corporation | Work: 405.552.8054 | Mobile: 405.200.8088 |
http://www.dvn.com <http://www.dvn.com/> 

 

From: gptalk-bounce@xxxxxxxxxxxxx [mailto:gptalk-bounce@xxxxxxxxxxxxx]
On Behalf Of Darren Mar-Elia
Sent: Thursday, November 20, 2008 9:18 AM
To: gptalk@xxxxxxxxxxxxx
Subject: [gptalk] Re: New Twist on old problem - Script set to wait on
network - but inside script network names not resolved

 

In addition, I have seen this happen even when everything is fine. I
think it ends up being a timing issue. What I always recommend to folks
is that if you're going to use logon scripts, (or startup scripts) put
some logging into them so that you can catch errors. That's the only way
you can really tell when something is happening.

 

Darren

 

From: gptalk-bounce@xxxxxxxxxxxxx [mailto:gptalk-bounce@xxxxxxxxxxxxx]
On Behalf Of Omar Droubi
Sent: Wednesday, November 19, 2008 4:00 PM
To: gptalk@xxxxxxxxxxxxx
Subject: [gptalk] Re: New Twist on old problem - Script set to wait on
network - but inside script network names not resolved

 

No- not if one DNS server is ok and the other is not-that is why you
would check both of them. But if there is only 1 DNS server then-I would
check to see if the file server has more than A (host) record as when a
DNS record is queried- all matching records are returned

 

For example: on a server named server1.domain.com you can get
192.168.5.1, 192.168.0.1 and 192.168.5.3- Say for example 192.168.0.1
was the old IP address- when a client queries this record all three will
be returned- but when connecting to the server the Windows client will
1st try 192.168.5.1 and the next connection attempt will try 192.168.0.1
and so on. 

 

Now in any of these situations- you would get more frequent failures-so
I just recommend that you verify all FWD and reverse DNS records- and
then take the DNS out of the picture as OK.

 

 

 

From: gptalk-bounce@xxxxxxxxxxxxx [mailto:gptalk-bounce@xxxxxxxxxxxxx]
On Behalf Of Booker.Washington@xxxxxxxxxxxxxx
Sent: Wednesday, November 19, 2008 3:19 PM
To: gptalk@xxxxxxxxxxxxx
Subject: [gptalk] Re: New Twist on old problem - Script set to wait on
network - but inside script network names not resolved

 

IF the DNS were screwed up, wouldn't it happen everytime?

 

 

 

Booker T. Washington III

Systems Support Specialist

404-894-8716 direct

404-385-5188 alt

 

From: gptalk-bounce@xxxxxxxxxxxxx [mailto:gptalk-bounce@xxxxxxxxxxxxx]
On Behalf Of Omar Droubi
Sent: Wednesday, November 19, 2008 5:15 PM
To: gptalk@xxxxxxxxxxxxx
Subject: [gptalk] Re: New Twist on old problem - Script set to wait on
network - but inside script network names not resolved

 

One of things I usually do is separate the wait for network startup and
run logon script synchronously on a separate GPO that only applies these
settings to computer objects (of course I only define these settings in
the computer configuration section)

 

Then I just run the user GPO separately- applied to user accounts of
course.

 

Regarding your particular issue- I would verify that the DNS server IP
addresses that are assigned to the workstations have properly configured
forward and reverse DNS entries in their DNS table- and that both the
DNS servers have the correct DNS entries for the file server. I think
the problem is in here -IMHO

 

Omar

 

 

 

From: gptalk-bounce@xxxxxxxxxxxxx [mailto:gptalk-bounce@xxxxxxxxxxxxx]
On Behalf Of Booker.Washington@xxxxxxxxxxxxxx
Sent: Wednesday, November 19, 2008 12:56 PM
To: gptalk@xxxxxxxxxxxxx
Subject: [gptalk] New Twist on old problem - Script set to wait on
network - but inside script network names not resolved

 

OK, I have the script below, and inside of the GPO, the settings are set
for Always wait for the network at computer startup and logon

 

And

Run logon scripts synchronously

 

But intermittently (And only once thus far), when it tries to map a
drive, I will get an error that the network name could not be found.

 

If I log off and log back on, then no problem.

 

Could I be missing a setting to make sure everything involved with name
recognition is initialized and ready to resolve names

 

 

Script contents below

 

 

Option Explicit 

 

Dim objSysInfo, objNetwork, strUserPath, objUser 

Dim adoCommand, adoConnection, strBase, strAttributes 

Dim objGroupList 

 

 

Set objSysInfo = CreateObject("ADSystemInfo") 

Set objNetwork = CreateObject("Wscript.Network") 

 

 

strUserPath = "LDAP://" & objSysInfo.UserName 

Set objUser = GetObject(strUserPath) 

 

 

'Removes curent mappings 

On Error Resume Next 

objNetwork.RemoveNetworkDrive "L:", True, True 

objNetwork.RemoveNetworkDrive "J:", True, True 

objNetwork.RemoveNetworkDrive "Z:", True, True 

objNetwork.RemoveNetworkDrive "R:", True, True 

objNetwork.RemoveNetworkDrive "N:", True, True 

objNetwork.RemoveNetworkDrive "O:", True, True 

objNetwork.RemoveNetworkDrive "U:", True, True 

objNetwork.RemoveNetworkDrive "S:", True, True 

objNetwork.RemoveNetworkDrive "M:", True, True 

objNetwork.RemoveNetworkDrive "I:", True, True 

objNetwork.RemoveNetworkDrive "K:", True, True 

objNetwork.RemoveNetworkDrive "Z:", True, True 

objNetwork.RemoveNetworkDrive "X:", True, True 

objNetwork.RemoveNetworkDrive "Y:", True, True 

objNetwork.RemoveNetworkDrive "Q:", True, True 

On Error GoTo 0 

 

 

If (IsMember(objUser, "GTS IT Services Group") = True) Then 

    objNetwork.MapNetworkDrive "Y:", _ 

"\\filesrvr-01.domain.com\com\shares\groups\IT services", False 

End If 

 

 

If (IsMember(objUser, "GTS Career Services") = True) Then 

    objNetwork.MapNetworkDrive "L:", _

"\\filesrvr-01.domain.com\com\shares\groups\Career Services", False 

    objNetwork.MapNetworkDrive "J:", _

"\\filesrvr-01.domain.com\com\shares\groups\Career Svcs_Act", False 

    objNetwork.MapNetworkDrive "Z:", _

"\\filesrvr-01.domain.com\com\shares\groups\Undergraduate Office", False


End If 

 

 

If (IsMember(objUser, "GTS Career Services SAs") = True) Then 

    objNetwork.MapNetworkDrive "L:", _

"\\filesrvr-01.domain.com\com\shares\groups\Career Services", False 

    objNetwork.MapNetworkDrive "J:", _

"\\filesrvr-01.domain.com\com\shares\groups\Career Svcs_Act", False 

    objNetwork.MapNetworkDrive "Z:", _

"\\filesrvr-01.domain.com\com\shares\groups\Undergraduate Office", False


End If 

 

 

If (IsMember(objUser, "GTS CIBER") = True) Then 

    objNetwork.MapNetworkDrive "R:", _

"\\filesrvr-01.domain.com\com\shares\groups\CIBER", False 

End If 

 

 

If (IsMember(objUser, "GTS Communications") = True) Then 

    objNetwork.MapNetworkDrive "R:", _

"\\filesrvr-01.domain.com\com\shares\groups\Communications", False 

    objNetwork.MapNetworkDrive "N:", _

"\\filesrvr-01.domain.com\com\shares\groups\DeanSuite", False 

End If 

 

 

If (IsMember(objUser, "GTS Communications Share Guest access") = True)
Then 

    objNetwork.MapNetworkDrive "R:", _

"\\filesrvr-01.domain.com\com\shares\groups\Communications", False 

    objNetwork.MapNetworkDrive "N:", _

"\\filesrvr-01.domain.com\com\shares\groups\DeanSuite", False 

End If 

 

 

If (IsMember(objUser, "GTS Dean Suite non HR") = True) Then 

    objNetwork.MapNetworkDrive "L:", _ 

"\\filesrvr-01.domain.com\com\shares\groups\Building Operations", False 

    objNetwork.MapNetworkDrive "N:", _ 

"\\filesrvr-01.domain.com\com\shares\groups\DeanSuite", False 

    objNetwork.MapNetworkDrive "O:", _

"\\filesrvr-01.domain.com\com\shares\groups\Accounting", False 

    objNetwork.MapNetworkDrive "U:", _

"\\filesrvr-01.domain.com\com\shares\groups\Graduate Assistantship",
False 

    objNetwork.MapNetworkDrive "S:", _ 

"\\filesrvr-01.domain.com\com\shares\groups\Accounting\FAcS", False 

End If 

 

 

If (IsMember(objUser, "GTS Development") = True) Then 

    objNetwork.MapNetworkDrive "L:", _

"\\filesrvr-01.domain.com\com\shares\groups\Development", False 

    objNetwork.MapNetworkDrive "R:", _ 

"\\filesrvr-01.domain.com\com\shares\groups\Communications", False 

    objNetwork.MapNetworkDrive "M:", _

"\\filesrvr-01.domain.com\com\shares\groups\Development\Student Share",
False 

    objNetwork.MapNetworkDrive "N:", _

"\\filesrvr-01.domain.com\com\shares\groups\DeanSuite", False 

End If 

 

 

If (IsMember(objUser, "GTS Development SAs") = True) Then 

    objNetwork.MapNetworkDrive "M:", _

"\\filesrvr-01.domain.com\com\shares\groups\Development\Student Share",
False 

End If 

 

 

If (IsMember(objUser, "GTS Eview Users") = True) Then 

    objNetwork.MapNetworkDrive "Y:", _

"\\filesrvr-01.domain.com\com\shares\groups\eview", False 

End If 

 

 

If (IsMember(objUser, "GTS Executive Masters") = True) Then 

    objNetwork.MapNetworkDrive "I:", _ 

"\\filesrvr-01.domain.com\com\shares\groups\Executive Education", False 

    objNetwork.MapNetworkDrive "J:", _

"\\filesrvr-01.domain.com\com\shares\groups\EMSMOT_Act", False 

    objNetwork.MapNetworkDrive "K:", _

"\\filesrvr-01.domain.com\com\shares\groups\EMSMOT", False 

    objNetwork.MapNetworkDrive "O:", _

"\\filesrvr-01.domain.com\com\shares\groups\Accounting", False 

    objNetwork.MapNetworkDrive "L:", _

"\\filesrvr-01.domain.com\com\shares\groups\Executive Programs", False 

End If 

 

 

If (IsMember(objUser, "GTS Executive Programs") = True) Then 

    objNetwork.MapNetworkDrive "I:", _

"\\filesrvr-01.domain.com\com\shares\groups\Executive Education", False 

    objNetwork.MapNetworkDrive "J:", _

"\\filesrvr-01.domain.com\com\shares\groups\EMSMOT_Act", False 

    objNetwork.MapNetworkDrive "K:", _

"\\filesrvr-01.domain.com\com\shares\groups\EMSMOT", False 

    objNetwork.MapNetworkDrive "O:", _

"\\filesrvr-01.domain.com\com\shares\groups\Accounting", False 

    objNetwork.MapNetworkDrive "L:", _

"\\filesrvr-01.domain.com\com\shares\groups\Executive Programs", False 

End If 

 

 

If (IsMember(objUser, "GTS Explab Share participants") = True) Then 

    objNetwork.MapNetworkDrive "Z:", _ 

"\\filesrvr-01.domain.com\com\shares\groups\Explab", False 

End If 

 

 

If (IsMember(objUser, "GTS Graduate Office") = True) Then 

    objNetwork.MapNetworkDrive "M:", _

"\\filesrvr-01.domain.com\com\shares\groups\Graduate Office", False 

End If 

 

 

If (IsMember(objUser, "GTS Grad Assistant Share") = True) Then 

    objNetwork.MapNetworkDrive "U:", _ 

"\\filesrvr-01.domain.com\com\shares\groups\Graduate Assistantship",
False 

End If 

 

 

If (IsMember(objUser, "GTS HR staff") = True) Then 

    objNetwork.MapNetworkDrive "X:", _ 

"\\filesrvr-01.domain.com\com\shares\groups\Building Operations", False 

    objNetwork.MapNetworkDrive "N:", _

"\\filesrvr-01.domain.com\com\shares\groups\DeanSuite", False 

    objNetwork.MapNetworkDrive "O:", _

"\\filesrvr-01.domain.com\com\shares\groups\Accounting", False 

    objNetwork.MapNetworkDrive "Y:", _

"\\filesrvr-01.domain.com\com\shares\groups\Communications", False 

    objNetwork.MapNetworkDrive "R:", _

"\\filesrvr-01.domain.com\com\shares\groups\Human Resources", False 

    objNetwork.MapNetworkDrive "Q:", _

"\\filesrvr-01.domain.com\com\shares\groups\Accounting\Pcard", False 

End If 

 

 

If (IsMember(objUser, "ILE Office") = True) Then 

    objNetwork.MapNetworkDrive "J:", _

"\\filesrvr-01.domain.com\com\shares\groups\Institute for LE", False 

End If 

 

 

If (IsMember(objUser, "ILE GRAs") = True) Then 

    objNetwork.MapNetworkDrive "J:", _

"\\filesrvr-01.domain.com\com\shares\groups\Institute for LE", False 

End If 

 

 

If (IsMember(objUser, "GTS Tiger Share participants") = True) Then 

    objNetwork.MapNetworkDrive "R:", _

"\\filesrvr-01.domain.com\com\shares\groups\Tiger", False 

End If 

 

 

If (IsMember(objUser, "GTS Undergraduate Office") = True) Then 

    objNetwork.MapNetworkDrive "M:", _

"\\filesrvr-01.domain.com\com\shares\groups\Undergraduate Office", False


End If 

 

 

If (IsMember(objUser, "GTS Recruiting Share Access") = True) Then 

    objNetwork.MapNetworkDrive "Q:", _

"\\filesrvr-01.domain.com\com\shares\groups\Recruiting", False 

End If 

 

 

If (IsMember(objUser, "GTS Faculty") = True) Then 

    objNetwork.MapNetworkDrive "S:", _

"\\filesrvr-01.domain.com\com\shares\groups\Accounting\FAcS", False 

End If 

 

 

Function IsMember(ByVal objADObject, ByVal strGroupNTName) 

    ' Function to test for group membership. 

    ' objADObject is a user or computer object. 

    ' strGroupNTName is the NT name (sAMAccountName) of the group to
test. 

    ' objGroupList is a dictionary object, with global scope. 

    ' Returns True if the user or computer is a member of the group. 

    ' Subroutine LoadGroups is called once for each different
objADObject. 

 

 

    Dim objRootDSE, strDNSDomain 

 

 

    ' The first time IsMember is called, setup the dictionary object 

    ' and objects required for ADO. 

    If (IsEmpty(objGroupList) = True) Then 

        Set objGroupList = CreateObject("Scripting.Dictionary") 

        objGroupList.CompareMode = vbTextCompare 

 

 

        Set adoCommand = CreateObject("ADODB.Command") 

        Set adoConnection = CreateObject("ADODB.Connection") 

        adoConnection.Provider = "ADsDSOObject" 

        adoConnection.Open "Active Directory Provider" 

        adoCommand.ActiveConnection = adoConnection 

 

 

        Set objRootDSE = GetObject("LDAP://RootDSE") 

        strDNSDomain = objRootDSE.Get("defaultNamingContext") 

 

 

        adoCommand.Properties("Page Size") = 100 

        adoCommand.Properties("Timeout") = 30 

        adoCommand.Properties("Cache Results") = False 

 

 

        ' Search entire domain. 

        strBase = "<LDAP://" & strDNSDomain & ">" 

        ' Retrieve NT name of each group. 

        strAttributes = "sAMAccountName" 

 

 

        ' Load group memberships for this user or computer into
dictionary 

        ' object. 

        Call LoadGroups(objADObject) 

        Set objRootDSE = Nothing 

    End If 

    If (objGroupList.Exists(objADObject.sAMAccountName & "\") = False)
Then 

        ' Dictionary object established, but group memberships for this 

        ' user or computer must be added. 

        Call LoadGroups(objADObject) 

    End If 

    ' Return True if this user or computer is a member of the group. 

    IsMember = objGroupList.Exists(objADObject.sAMAccountName & "\" _ 

        & strGroupNTName) 

End Function 

 

 

Sub LoadGroups(ByVal objADObject) 

    ' Subroutine to populate dictionary object with group memberships. 

    ' objGroupList is a dictionary object, with global scope. It keeps
track 

    ' of group memberships for each user or computer separately. ADO is
used 

    ' to retrieve the name of the group corresponding to each objectSid
in 

    ' the tokenGroup array. Based on an idea by Joe Kaplan. 

 

 

    Dim arrbytGroups, k, strFilter, adoRecordset, strGroupName, strQuery


 

 

    ' Add user name to dictionary object, so LoadGroups need only be 

    ' called once for each user or computer. 

    objGroupList.Add objADObject.sAMAccountName & "\", True 

 

 

    ' Retrieve tokenGroups array, a calculated attribute. 

    objADObject.GetInfoEx Array("tokenGroups"), 0 

    arrbytGroups = objADObject.Get("tokenGroups") 

 

 

    ' Create a filter to search for groups with objectSid equal to each 

    ' value in tokenGroups array. 

    strFilter = "(|" 

    If (TypeName(arrbytGroups) = "Byte()") Then 

        ' tokenGroups has one entry. 

        strFilter = strFilter & "(objectSid=" _ 

            & OctetToHexStr(arrbytGroups) & ")" 

    ElseIf (UBound(arrbytGroups) > -1) Then 

        ' TokenGroups is an array of two or more objectSid's. 

        For k = 0 To UBound(arrbytGroups) 

            strFilter = strFilter & "(objectSid=" _ 

                & OctetToHexStr(arrbytGroups(k)) & ")" 

        Next 

    Else 

        ' tokenGroups has no objectSid's. 

        Exit Sub 

    End If 

    strFilter = strFilter & ")" 

 

 

    ' Use ADO to search for groups whose objectSid matches any of the 

    ' tokenGroups values for this user or computer. 

    strQuery = strBase & ";" & strFilter & ";" _ 

        & strAttributes & ";subtree" 

    adoCommand.CommandText = strQuery 

    Set adoRecordset = adoCommand.Execute 

 

 

    ' Enumerate groups and add NT name to dictionary object. 

    Do Until adoRecordset.EOF 

        strGroupName = adoRecordset.Fields("sAMAccountName").Value 

        objGroupList.Add objADObject.sAMAccountName & "\" _ 

            & strGroupName, True 

        adoRecordset.MoveNext 

    Loop 

    adoRecordset.Close 

 

 

    Set adoRecordset = Nothing 

End Sub 

 

 

Function OctetToHexStr(ByVal arrbytOctet) 

    ' Function to convert OctetString (byte array) to Hex string, 

    ' with bytes delimited by \ for an ADO filter. 

 

 

    Dim k 

    OctetToHexStr = "" 

    For k = 1 To Lenb(arrbytOctet) 

        OctetToHexStr = OctetToHexStr & "\" _ 

            & Right("0" & Hex(Ascb(Midb(arrbytOctet, k, 1))), 2) 

    Next 

End Function 

 

 

 

Booker T. Washington III

Systems Support Specialist

 


Confidentiality Warning: This message and any attachments are intended only for 
the use of the intended recipient(s), are confidential, and may be privileged. 
If you are not the intended recipient, you are hereby notified that any review, 
retransmission, conversion to hard copy, copying, circulation or other use of 
all or any portion of this message and any attachments is strictly prohibited. 
If you are not the intended recipient, please notify the sender immediately by 
return e-mail, and delete this message and any attachments from your system. 

Other related posts: