[RESOLU][vbs]access denied

access denied [RESOLU][vbs] - VB/VBA/VBS - Programmation

Marsh Posté le 22-06-2010 à 09:42:09    

Bonjour,
 
Tout d'abord, merci pour tout l'aide que vous m'apporterez.
 
Je planifie une migration sur un réseau qui n'a pas vraiment de structure. Pour gagner du temps, je voudrais scripter la récupération de certaines informations via un script VBS qui serait exécuté via une groupe policy.  
 
 


[Option Explicit
'On Error Resume Next
 
Dim strUserName 'le nom de l'utilisateur débarrassé du nom de domaine
Dim colComputerInfosUsername '
Dim objComputerInfosUserName '
Dim objUserName ' nom d'utilisateur récupéré par wmi
Dim objComputerInfos ' un des objets contenu dans la requête faite sur le wmi
Dim colComputerInfos ' résultat brut de la requete faite sur le wmi
Dim strDirectory 'nom du répertoire  
Dim strFile   'nom du fichier
Dim strslash  'isole le /
Dim strCore   'le corps du nom du fichier
Dim strExt   'extension du fichier
Dim objFSO   'obj permettant l'accès au système de fichier
Dim objFolder  'Objet répertoire
Dim objShell  
Dim objTextFile
Dim objFile
Dim strPos
Dim colNetworkShares 'Collection contenant les partages mappés sur un pc
Dim objNetworkShares 'un object dans cette collection
Dim colNetworkinfos 'collections contenant les informations IP
Dim objNetworkinfos 'Un objet dans la collection
Dim strIpAddress 'adress IP
DIM strHostname
Dim strDomain
Dim strLetter
Dim strShare
Dim strIP
 
const ForReading = 1
const ForWriting = 2
const ForAppending = 8
 
Sub GetUserName 'fonction de récupération du nom d'utilisateur sans le domaine
 set colComputerInfosUserName=GetObject("winmgmts:" ).ExecQuery("Select name,Domain,UserName from win32_ComputerSystem" )
 
 For Each objComputerInfosUserName in colComputerInfosUserName
  objUserName=objComputerInfosUserName.UserName
 Next
End Sub
 
Sub DelDPUserName
 strpos = InStr(1, objUserName, "\" )
 strUserName = Mid(objUserName, strpos + 1)
End Sub
 
Sub CreateFile 'création du répertoire utilisé pour l'inventaire et s'il existe déjà on s'y connecte
 
strDirectory = "Q:\inventaire"
strslash="\"
strCore = strUserName
strExt=".txt"
strFile = "\" & strCore & ".txt"
wscript.Echo strUserName
 
Set objFSO=CreateObject("Scripting.FileSystemObject" )
 
 If objFSO.FolderExists(strDirectory) Then
  Set ObjFolder=objFSO.GetFolder(strDirectory)
 Else
  Set objFolder=objFSO.CreateFolder(strDirectory)
 End If
 
 If objFSO.FileExists(strDirectory&strFile) Then
  set objFolder=objFSO.GetFolder(strDirectory)
 Else
  set objFile=objFSO.CreateTextFile(strDirectory&strFile)
 End if
End Sub
 
GetUserName
DelDPUserName
CreateFile
 
wscript.sleep 15000
 
Set objTextFile=objFSO.OpenTextFile(strDirectory&strFile, ForAppending, True)
 
'On commence par récupérer les infos propres au pc. Nom, Domaine et Utilisateur Logué
set colComputerInfos =_
 GetObject("winmgmts:" ).ExecQuery("select name,Domain,Username from Win32_ComputerSystem" )
 
'On affiche les infos récoltées
'Set objTextFile=objFSO.OpenTextFile(strDirectory&strFile, ForAppending, True)
 
 
For Each objComputerInfos in colComputerInfos
 ObjTextFile.WriteLine(strUserName & ";Hostname: ;" & objComputerInfos.name)
 ObjTextFile.WriteLine(strUserName & ";Domain: ;" & objComputerInfos.Domain)
 ObjTextFile.WriteLine(strUserName & ";UserName: ;" & objComputerInfos.UserName)
Next
 
'Récolte des partages montés sur la machines, Lettre, partage et nom d'utilisateur utilisé
 
Set colNetworkShares=_
 GetObject("winmgmts:" ).ExecQuery("select LocalName,RemoteName,UserName from Win32_NetworkConnection" )
 
'récupération du résultat.
 
For Each objNetworkShares in colNetworkShares
 ObjTextFile.WriteLine(strUserName & ";Letter: ;" & objNetworkShares.LocalName & ";Share: ;" & objNetworkShares.RemoteName & ";UserName: ;" & objNetworkShares.UserName)
' ObjTextFile.WriteLine(strUserName & ";Share: ;" & objNetworkShares.RemoteName)
' ObjTextFile.WriteLine(strUserName & ";UserName: ;" & objNetworkShares.UserName)
Next
 
' Récolte de l'adresse IP et de la Mac Adresse de la carte réseau qui en possède une
 
 set colNetworkinfos=GetObject("winmgmts:" ).ExecQuery("Select Index,MACAddress,IPAddress from win32_NetworkAdapterConfiguration where IpEnabled=true" )
 
 For Each objNetworkInfos in colNetworkInfos
   For Each strIpAddress in objNetworkInfos.IPAddress
   ObjTextFile.WriteLine (strUserName & ";IP: ;" & strIPAddress & ";MAC: ;" & objNetworkInfos.MACAddress)
'   ObjTextFile.WriteLine("MAC: " & objNetworkInfos.MACAddress)
   Next
   
 Next


 
Le script est fonctionnel, mais lorsque je l'exécute la 1ère fois, j'ai l'erreur suivante
 


Script: inventaire.vbs
Ligne: 85
caract: 1
Erreur: Permission Denied
code: 800A0046


 
La ligne en question:  

Set objTextFile=objFSO.OpenTextFile(strDirectory&strFile, ForAppending, True)


 
 Ce qui me fait dire que le fichier n'est pas encore prêt lorsque le script essaie d'y écrire les informations récoltées. J'ai ajouté la commande

wscript.sleep 15000

pour qu'il attende 15 seconde après la création du fichier avant de continuer l'exécution de la suite du code, mais en vain.
 
La 2ème fois, par contre, comme le fichier existe, aucun problème, les données sont inscrite dans le fichier de destination.  
 
Edit: Je viens de lire le sujet sur l'art de poser une question.  
 
Je vais donc essayer de vous prouver que je ne reste pas les bras ballants en espérant qu'on m'assiste.  
 
J'ai fait des recherches sur Internet avec comme mot clé le code d'erreur 800A0046. Code qui d'après le résultat pourrait provenir d'un problème de droits sur le fichier. Le répertoire est en accès complet pour tous les utilisateurs du domaine. Je peux donc à priori écarter un problème de droit.
 
Ensuite comme le problème ne se pose que lorsqu'il y a création effective du fichier, j'ai supposé qu'il s'agissait d'un problème d'accès trop rapide après la création du fichier en question. J'ai ajouté une pause après la création du fichier avec la commande wscript.sleep 15000, mais sans résultat.  
 
Là, je vais tester un accès au fichier juste après sa création et en fonction du résultat afficher une erreur ou poursuivre l'exécution du script.  
 
Merci d'avance pour votre aide.


Message édité par Hanka le 22-06-2010 à 11:26:26
Reply

Marsh Posté le 22-06-2010 à 09:42:09   

Reply

Marsh Posté le 22-06-2010 à 11:23:21    

j'avance...

 

J'ai édité cette portion du code

 

Sub CreateFile 'création du répertoire utilisé pour l'inventaire et s'il existe déjà on s'y connecte
 

 

strDirectory = "Q:\inventaire"
strslash="\"
strCore = strUserName
strExt=".txt"
strFile = "\" & strCore & ".txt"
wscript.Echo strUserName
 

 

Set objFSO=CreateObject("Scripting.FileSystemObject" )
 

 

If objFSO.FolderExists(strDirectory) Then
  Set ObjFolder=objFSO.GetFolder(strDirectory)
 Else
  Set objFolder=objFSO.CreateFolder(strDirectory)
 End If
 

 

If objFSO.FileExists(strDirectory&strFile) Then
  set objFolder=objFSO.GetFolder(strDirectory)
 Else
  set objFile=objFSO.CreateTextFile(strDirectory&strFile)
 End if

 

set objFile = nothing
set objFolder = nothing

 


End Sub

 

set objFile = nothing
set objFolder = nothing

 

En ajoutant les 2 lignes ci-dessus, le message disparaît.


Message édité par Hanka le 22-06-2010 à 11:27:36
Reply

Marsh Posté le 29-06-2010 à 20:43:29    

Petite question subsidiaire.
 
J'utilise notepad ++ pour écrire mes scripts. Lorsqu'un collègue édite un de mes scripts avec notepad, le script ne fonctionne plus et affiche le message d'erreur

Citation :

caractère incorrect ligne 1 ,1


 
Pourtant avant, j'utilisais notepad pour écrire mes scripts sans jamais rencontrer ce problème.  
 
Une idée?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed