Question MFCOM

Bonjour à tous,



Sur une ferme XP FR3, j’avais besoin d’un script qui désactive le logon et clos les sessions en cours sur certains serveurs de la ferme.

Pour cela, j’ai récupéré des scripts dispo sur le web que j’ai adapté à mon besoin (vbs).



Je bute toujours sur un problème qui est assez récurrent lorsque je code des scripts mfcom :


  1. Après la création de l’objet, l’initialisation ne se fait que si le paramètre est 1 (alors que le paramètre est toujours MetaFrameWinFarmObject dans les codes dispo en ligne). cf exemple ci-dessous :
Set theFarm = CreateObject("MetaFrameCOM.MetaFrameFarm")
'theFarm.Initialize(MetaFrameWinFarmObject)
theFarm.Initialize(1)

En fait j’aimerais bien comprendre.



2) Ce qui m’amène à mon deuxième problème : je n’arrive pas à faire fonctionner la méthode logoff de l’objet session. ex :

For each session in aserver.sessions
WScript.Echo " Client Name : " & Session.ClientName
Session.Logoff(2)
next

-> j’ai essayé avec comme paramètre entre () 0,1 , TRUE. Sans résultat. La session est bien vue (vérif par le echo) mais le message d’erreur reste “argument ou procedure d’appel incorrect”. Si quelqu’un a l’explication concernant le role du paramètre en tre(), je suis preneur.

J’ai réussi à contourner mon probleme via la commande logoff de Windows :


Set WshShell = WScript.CreateObject("WScript.Shell")
commande = "logoff " & session.sessionname & " /SERVER:" & aServer.ServerName
WshShell.Run commande


Mais je reste interessé par l'explication...

Voici un bout de code d’une appli que j’ai fait pour un client.

Public Sub UserLogoff(ByVal sSession As String)

Dim aSession As MetaFrameSession

Dim sServerName As String

Dim sUserName As String

Dim aUserinfo

Dim sSessionID



aUserinfo = Split(sSession, ";")

sUserName = aUserinfo(0)

sServerName = aUserinfo(1)

sSessionID = aUserinfo(2)

'Call MsgBox("user: " & sUserName & " Serveur: " & sServerName, vbOKOnly, "tt")

On Error Resume Next

Set aSession = CreateObject("MetaFrameCOM.MetaFrameSession")

Call aSession.Initialize(MetaFrameWinSrvObject, sServerName, "", sSessionID)

AddLog ("logoff: " & sUserName & " on: " & sServerName)

aSession.Logoff (False)



Set aSession = Nothing



End Sub

"pier2" wrote:
-> j'ai essayé avec comme paramètre entre () 0,1 , TRUE. Sans résultat. La session est bien vue (vérif par le echo) mais le message d'erreur reste "argument ou procedure d'appel incorrect". Si quelqu'un a l'explication concernant le role du paramètre en tre(), je suis preneur.

Le paramètre entre parenthèse est un booléen, vrai=demande le logoff et attend la fin de la session pour rendre la main. faux=demande le logoff et passe au suivant. donc dans ta boucle un FAUX te fait gagné du temps.
Public: HRESULT Logoff(
BOOL bWait
);

bWait

If the calling process will wait for the logoff to complete, set this parameter to TRUE. If the calling process wants the property to immediately return, set this parameter to FALSE.

Et enfin pour répondre a ta premier question:

Si Citrix utilise des .WSF et pas des .VBS c’est pour pouvoir ajouter la ligne:



car dans ton script
theFarm.Initialize(MetaFrameWinFarmObject)

MetaFrameWinFarmObject est un constante que ton .vbs ne connait pas!
MetaFrameWinFarmObject = 1 donc quand tu met 1 ca fonctionne.

Voici la liste des constantes que tu peux utilisé:

' MetaFrame Object Types
const MetaFrameUnknownObject = 0 ' "MFCOM Unknown Object"
const MetaFrameWinFarmObject = 1 ' "MFCOM Windows Farm Object"
const MetaFrameZoneObject = 2 ' "MFCOM Zone Object"
const MetaFrameWinAppObject = 3 ' "MFCOM Windows Application Object"
const MetaFrameLicenseObject = 4 ' "MFCOM License Object"
const MetaFrameAcctAuthObject = 5 ' "MFCOM Account Authority Object"
const MetaFrameWinSrvObject = 6 ' "MFCOM Windows Server Object"
const MetaFrameUserObject = 7 ' "MFCOM User Object"
const MetaFrameGroupObject = 8 ' "MFCOM Group Object"
const MetaFrameProcessObject = 9 ' "MFCOM Process Object"
const MetaFrameSessionObject = 10 ' "MFCOM Session Object"
const MetaFrameChannelObject = 11 ' "MFCOM Virtual Channel Object"
const MetaFrameAppFolder = 12 ' "MFCOM Application Folder Object"
const MetaFrameSrvFolder = 13 ' "Server Folder Object"
const MetaFrameIMSAppObject = 14 ' "MFCOM Installation Manager Service Application Object"
const MetaFrameRMSAppObject = 15 ' "MFCOM Resource Manager Service Application Object"
const MetaFrameUnixAppObject = 16 ' "MFCOM UNIX Application Object"
const MetaFrameContentObject = 17 ' "MFCOM Published Content Object"
const MetaFrameFileTypeObject = 18 ' "MFCOM File Type Object"
const MetaFrameUserPolicyObject = 19 ' "MFCOM User Policy Object"
const MetaFrameSessionPolicyObject = 19 ' "MFCOM Session Policy Object"
const MetaFrameLicenseSetObject = 20 ' "MFCOM License Set Object"
const MetaFrameLicenseNumberObject = 21 ' "MFCOM License Number Object"
const MetaFrameAccountFolder = 22 ' "MFCOM Account Folder Object"
const MetaFramePrinterObject = 23 ' "MFCOM Printer Object"
const MetaFramePrinterDriverObject = 24 ' "MFCOM Printer Driver Object"
const MetaFrameAdminObject = 25 ' "MFCOM Administrator Object"
const MetaFrameMeObject = 26 ' "MFCOM ME Object"
const MetaFrameLoadEvaluatorObject = 27 ' "MFCOM Load Evaluator Object"
const MeltaFrameSessionPolFilterObject = 28 ' "MFCOM Policy Filter Object"
const MetaFrameAppliedPolicyObject = 29 ' "MFCOM Applied Policy Object"
const MetaFrameFileObject = 30 ' "MFCOM File Object"
const MetaFrameIconObject = 31 ' "MFCOM Icon Object"
const MetaFrameVIPRangeObject = 32 ' "MFCOM Virtual IP Range Object"
const MetaFrameLMRuleObject = 33 ' "MFCOM Load Manager Rule Object"
const MetaFrameAIEObject = 34 ' "MFCOM AIE Object"
const MetaFrameAIEFolder = 35 ' "MFCOM AIE Folder Object"
const MetaFrameAIERuleObject = 36 ' "MFCOM AIE Rule Object"
const MetaFrameHotfixObject = 37 ' "MFCOM Hotfix Object"

' Account Authorities
const MFAccountAuthorityUnknown = 0 ' "Unknown Account Authority"
const MFAccountAuthorityNTDomain = 1 ' "NT Domain"
const MFAccountAuthorityNDS = 2 ' "Novell Directory Services"
const MFAccountAuthorityADS = 3 ' "Windows Active Directory"

' Acount Types
const MFAccountTypeUnknown = 0 ' "Unknown Account Type"
const MFAccountLocalUser = 1 ' "Local User"
const MFAccountDomainUser = 2 ' "Domain User"
const MFAccountLocalGroup = 3 ' "Local Group"
const MFAccountGlobalGroup = 4 ' "Global Group"
const MFAccountUniversalGroup = 5 ' "Universal Group"
const MFAccountDomainLocalGroup = 6 ' "Domain Local Group"
const MFAccountFolder = 7 ' "Account Folder"

' PN Attributes
const MFWinAppPNAttrNone = 0
const MFWinAppDisabled = 1
const MFWinAppMinimumSound = 2
const MFWinAppMinimumEncrypt = 4
const MFWinAppDesktop = 8 ' "Published Desktop"
const MFWinAppAnonymous = 16 ' "Anonymous Application"

' MetaFrame Color Selections
const MFWinColorUnknown = 0
const MFWinColor16 = 1
const MFWinColor256 = 2
const MFWinColor64K = 3
const MFWinColor16M = 4

' MetaFrame Window Type
const MFWinWindowUnknown = 0
const MFWinWindow640X480 = 1
const MFWinWindow800X600 = 2
const MFWinWindow1024X768 = 3
const MFWinWindow1280X1024 = 4
const MFWinWindowCustom = 5
const MFWinWindowPercent = 6
const MFWinWindowFullScreen = 7
const MFWinWindow1600X1200 = 8


Bon week-end

Pour ta 2eme question ce code fonctionne:

Dim theFarm, aServer, aSession
on error resume next
Set theFarm = CreateObject("MetaFrameCOM.MetaFrameFarm")
WScript.Echo "MetaFrame Farm Name: " & theFarm.FarmName
theFarm.Initialize (1)

For Each aServer In theFarm.Servers
if Lcase(aServer.ServerName) = Lcase("lenomduserveur") then
For Each aSession In aServer.Sessions
WScript.Echo aSession.UserName
aSession.logoff(false)
next
end if
Next

Fait bien attention a la case du nom !

Bonjour Chavers,



Merci pour tes réponses sur mes soucis de scripts et d’explications MFCOM.



Par contre, j’ai repris ton dernier script -sans modif- et testé sur ma ferme. J’ai le même résultat que précedement “Argument ou appel de procédure incorrect” rc=800A0005.



J’ai lancé le script depuis plusieurs serveurs de la ferme sans plus de succès.



Les serveurs de la ferme ne sont pas vraiment up-to-date, n’y aurait-il pas quelques hotfixs pour les objets MFCOM ?

Sur quel ligne a tu l’erreur ? si c’est au logoff verifie que tu as bien on “error resume next” avant dans le code. Car le script essaie de faire un logoff de toute les sessions (local ID 0, et les queue ICA et TCP)

:slight_smile:



Tu as raison, je n’avais pas remis la ligne “on error resume next” dans ma procédure…



Je te remercie