schon wieder mal gab es die Nachfrage im Alaska Forum und deshalb
hier der ganze Xbase++ Code den ich benutzte zusammen mit der
RegClass von Thomas Braun.
Mit dem Tool kann man kontrollieren ob man die Opportunistic locking
Registry Einträge vorhanden sind und ggf. anlegen/korrigieren.
was NICHT funktioniert ist die "wiederherstellung", welches evtl. ein
löschen von angelegten Einträgen beinhaltet, der Registry also vorher
ein BACKUP anfertigen !!!
die Einträge werden so mit einem W2003 Server und W2K/XP Work-
stationen betrieben und laufen (scheinbar) stabil. Trotzdem übernehme
ich hierfür keine "Garantie" wenn jemand mit diesen Einstellungen
Probleme haben sollte.
Wenn jemand noch einen Eintrag weiss möge er den doch bitte in diesem
Thread kundtun damit wir alles was davon haben.
gruss by OHR
Jimmy
Code: Alles auswählen
#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"
#pragma Library( "XBTBASE1.LIB" )
STATIC cServer := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters"
STATIC cWorkst := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanworkstation\parameters"
STATIC cSMB := "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MRxSmb\Parameters"
CLASS NewForm FROM _NewForm
EXPORTED:
METHOD init
METHOD create
ENDCLASS
METHOD NewForm:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
* Methode der Superklasse rufen
::_NewForm:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
RETURN self
METHOD NewForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
* Methode der Superklasse rufen
::_NewForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
* Datenbanken öffnen und Workareas auswählen
::OPSLOCK := Select()
* Werte in Editcontrols übertragen
AEval ( ::EditControls, { | oXbp | oXbp:SetData() } )
* Formular anzeigen
::show()
RETURN self
******************************************************************************
* Main Prozedur zum Testen des Formulars
******************************************************************************
PROCEDURE APPSYS
RETURN
PROCEDURE Main
LOCAL nEvent, oXbp, mp1, mp2
LOCAL datei := "OPSLOCK.DBF"
LOCAL oForm
IF .NOT. FILE(datei)
C_OPSLOCK(datei)
ENDIF
USE (datei) EXCLUSIV
SET INDEX TO OPSINDEX
* REGCOMPARE()
REGSTATUS()
oForm := NewForm():New():Create()
COL2BROW(oForm)
SetAppFocus( oForm:oBrowse )
SLEEP(5)
GO BOTTOM
oForm:oBrowse:RefreshAll()
SLEEP(5)
GO TOP
oForm:oBrowse:RefreshAll()
* DO WHILE .NOT. oForm:oBrowse:forceStable()
* SLEEP(5)
* ENDDO
nEvent := xbe_None
WHILE nEvent != xbeP_Close
nEvent := AppEvent ( @mp1, @mp2, @oXbp )
oXbp:HandleEvent ( nEvent, mp1, mp2 )
IF nEvent == xbeP_Quit
QUIT // AppQuit()
ENDIF
ENDDO
RETURN
******************************************************************************
*
******************************************************************************
FUNCTION C_OPSLOCK(datei)
LOCAL field_list:={}
LOCAL aKeys := {}
LOCAL i, iMax := 0
IF !FILE(datei)
aadd(field_list,{"ACTIVE" ,"L", 1,0})
aadd(field_list,{"SOW" ,"C", 1,0})
aadd(field_list,{"HKLM" ,"C",200,0})
aadd(field_list,{"KEY" ,"C", 70,0})
aadd(field_list,{"DWORD" ,"C", 8,0})
aadd(field_list,{"ISTDWORD","C", 8,0})
aadd(field_list,{"ORGDWORD","C", 8,0})
aadd(field_list,{"COMMENT" ,"C",200,0})
DBCREATE(datei,field_list)
endif
USE (datei) EXCLUSIV
//
// Server
//
AADD(aKeys,{"S","A","autodisconnect" ,"ffffffff"})
AADD(aKeys,{"S","A","ConnectionNoSessionsTimeout","ffffffff"})
AADD(aKeys,{"S","A","CachedOpenLimit" ,"0"})
AADD(aKeys,{"S","A","EnableOpLockForceClose" ,"1"})
AADD(aKeys,{"S","A","EnableOpLocks" ,"0"})
AADD(aKeys,{"S","A","OplocksDisabled" ,"1"})
//
// VISTA "Server"
//
AADD(aKeys,{"S","A","SMB2" ,"0"})
//
//
// Server W2K SMB
//
AADD(aKeys,{"T","A","OplocksDisabled" ,"1"})
//
// Workstation
//
AADD(aKeys,{"W","A","CachedOpenLimit" ,"0"})
AADD(aKeys,{"W","A","EnableOpLockForceClose" ,"1"})
AADD(aKeys,{"W","A","EnableOpLocks" ,"0"})
AADD(aKeys,{"W","A","OplocksDisabled" ,"1"})
AADD(aKeys,{"W","A","UseLockReadUnlock" ,"0"})
AADD(aKeys,{"W","A","UseUnlockBehind" ,"1"})
AADD(aKeys,{"W","A","UseOpportunisticLocking" ,"0"}) // UseOpp (2x "p")
AADD(aKeys,{"W","A","UtilizeNtCaching" ,"0"})
iMax := LEN(aKeys)
FOR i = 1 TO iMax
APPEND BLANK
REPLACE SOW WITH aKeys[i][1]
REPLACE HKLM WITH IF(aKeys[i][1]="S",cServer,IF(aKeys[i][1]="W",cWorkst,cSMB))
REPLACE KEY WITH aKeys[i][3]
REPLACE DWORD WITH aKeys[i][4]
REPLACE COMMENT WITH ""
REPLACE ACTIVE WITH .F.
REPLACE ISTDWORD WITH ""
REPLACE ORGDWORD WITH ""
NEXT
INDEX ON UPPER(SOW+KEY) TO OPSINDEX
//
// save original Registry Value
//
REGORIGIN()
CLOSE
RETURN(.t.)
FUNCTION GETREGKEY(cHKLM,cKEY)
LOCAL oReg := XbpReg():NEW(cHKLM)
LOCAL cRet := ""
IF oReg:Status()
oReg:ReadBinType := "C"
cRet := oReg:GetValue(cKEY)
ENDIF
RETURN cRet
FUNCTION SETREGKEY(cHKLM,cKEY,cDWORD)
LOCAL oReg := XbpReg():NEW(cHKLM)
LOCAL cRet := ""
IF .NOT. oReg:Status()
oReg:Create()
ENDIF
cRet := oReg:SetValue(cKEY,cDWORD)
RETURN cRet
FUNCTION DELREGKEY(cHKLM,cKEY)
LOCAL oReg := XbpReg():NEW(cHKLM)
LOCAL cRet := .F.
IF oReg:Status()
* cRet := oReg:DelKey(cKEY)
cRet := oReg:DelValue(cKEY)
ENDIF
RETURN cRet
FUNCTION EXISTKEY(cHKLM)
LOCAL oReg := XbpReg():NEW(cHKLM)
RETURN oReg:status()
FUNCTION SHOWVALUE(cHKLM)
LOCAL oReg := XbpReg():NEW(cHKLM)
LOCAL aRet := {}
IF oReg:Status()
aRet := oReg:ValueList(.F.)
ENDIF
RETURN aRet
FUNCTION REF2GETS(aEditcontrols)
LOCAL n, LenGets := len(aEditcontrols)
FOR n := 1 to LenGets
aEditcontrols[n]:setdata() // now VarBlock:setdata()
aEditcontrols[n]:show() // let me see my VarBlock now
NEXT
RETURN NIL
FUNCTION COL2BROW(oForm)
LOCAL oBrowse := oForm:oBrowse
LOCAL oCol
oCol := oBrowse:addColumn({|| OPSLOCK->ACTIVE }, 1,"" )
oCol:ColorBlock := {|| IF(OPSLOCK->ACTIVE , { GRA_CLR_WHITE ,GRA_CLR_DARKGREEN}, { GRA_CLR_BLACK,GRA_CLR_PALEGRAY } ) }
oCol:configure()
oCol := oBrowse:addColumn({|| OPSLOCK->SOW }, 1,"" )
oCol:ColorBlock := {|| IF(OPSLOCK->SOW="S" , { GRA_CLR_YELLOW,GRA_CLR_PINK }, ;
IF(OPSLOCK->SOW="T" , { GRA_CLR_WHITE ,GRA_CLR_DARKPINK }, ;
IF(OPSLOCK->SOW="W" , { GRA_CLR_BLACK ,GRA_CLR_CYAN}, ;
IF(OPSLOCK->SOW=" " , { GRA_CLR_WHITE ,GRA_CLR_RED }, ;
{ GRA_CLR_BLACK ,GRA_CLR_PALEGRAY } )))) }
oCol:configure()
oBrowse:addColumn({|| OPSLOCK->HKLM },45,"HKLM" )
oBrowse:addColumn({|| OPSLOCK->KEY },11,"KEY" )
oBrowse:addColumn({|| OPSLOCK->DWORD }, 4,"DWord" )
oBrowse:addColumn({|| OPSLOCK->ISTDWORD }, 4,"ist" )
oBrowse:addColumn({|| OPSLOCK->ORGDWORD }, 4,"Org" )
* oBrowse:addColumn({|| OPSLOCK->COMMENT}, 2,"Comment")
RETURN NIL
FUNCTION CENTERPOS( aSize, aRefSize )
RETURN { Int( (aRefSize[1] - aSize[1]) / 2 ) ;
, Int( (aRefSize[2] - aSize[2]) / 2 ) }
FUNCTION SETSHOW(cHKLM,cKEY,cDWORD)
LOCAL cHKLM1 := TRIM(cHKLM)
LOCAL cKEY1 := TRIM(cKEY)
LOCAL nDWORD
LOCAL lOrgin := .F.
IF VAL(cDWORD) > 0
nDWORD := VAL(cDWORD)
ELSE
IF EMPTY(cDWORD)
lOrgin := .T.
ELSE
IF UPPER(SUBSTR(cDWORD,1,1)) $ "ACBDEF"
nDWORD := VAL(StrToHex(UPPER(cDWORD)))
IF nDWORD > 99999999
nDWORD := 99999999
ENDIF
ELSE
nDWORD := VAL(cDWORD)
ENDIF
ENDIF
ENDIF
ALTD()
IF lOrgin
IF EMPTY(OPSLOCK->ORGDWORD)
DELREGKEY(cHKLM1,cKEY1)
ENDIF
ELSE
SETREGKEY(cHKLM1,cKEY1,nDWORD)
ENDIF
cDWORD := GETREGKEY(TRIM(cHKLM1),TRIM(cKEY1))
REPLACE OPSLOCK->ACTIVE WITH .T.
DO CASE
CASE VALTYPE(cDWORD) = "C"
CASE VALTYPE(cDWORD) = "N" ; cDWORD := LTRIM(STR(cDWORD))
CASE VALTYPE(cDWORD) = "A" ; cDWORD := cDWORD[1]
OTHERWISE
cDWORD := ""
REPLACE OPSLOCK->ACTIVE WITH .F.
ENDCASE
REPLACE OPSLOCK->ISTDWORD WITH cDWORD
RETURN NIL
FUNCTION REGSTATUS()
LOCAL cDWORD
GO TOP
DO WHILE !EOF()
cDWORD := GETREGKEY(TRIM(OPSLOCK->HKLM),TRIM(OPSLOCK->KEY))
REPLACE OPSLOCK->ACTIVE WITH .T.
DO CASE
CASE VALTYPE(cDWORD) = "C"
CASE VALTYPE(cDWORD) = "N" ; cDWORD := LTRIM(STR(cDWORD))
CASE VALTYPE(cDWORD) = "A" ; cDWORD := cDWORD[1]
OTHERWISE
cDWORD := ""
REPLACE OPSLOCK->ACTIVE WITH .F.
ENDCASE
REPLACE OPSLOCK->ISTDWORD WITH cDWORD
SKIP
ENDDO
GO TOP
RETURN NIL
FUNCTION REGORIGIN()
LOCAL cDWORD
GO TOP
DO WHILE !EOF()
cDWORD := GETREGKEY(TRIM(OPSLOCK->HKLM),TRIM(OPSLOCK->KEY))
DO CASE
CASE VALTYPE(cDWORD) = "C"
CASE VALTYPE(cDWORD) = "N" ; cDWORD := LTRIM(STR(cDWORD))
//
// hier gibt es Probleme ...
//
CASE VALTYPE(cDWORD) = "A" ; cDWORD := cDWORD[1]
OTHERWISE
cDWORD := ""
ENDCASE
REPLACE OPSLOCK->ORGDWORD WITH cDWORD
SKIP
ENDDO
GO TOP
RETURN NIL
FUNCTION REGCOMPARE()
LOCAL aServer
LOCAL aSMB
LOCAL aWorkst
LOCAL i,iMax,cSeek
LOCAL cDWORD
ALTD()
aServer := SHOWVALUE(cServer)
aSMB := SHOWVALUE(cSMB )
aWorkst := SHOWVALUE(cWorkst)
iMax := LEN(aServer)
FOR i = 1 TO iMax
cSeek := "S"+aServer[i][1]
SEEK(UPPER(cSeek))
IF FOUND()
ELSE
cDWORD := GETREGKEY(cServer,aServer[i][1])
* cDWORD := HexToStr(cDWORD) // XBTBASE1.LIB
DO CASE
CASE VALTYPE(cDWORD) = "C"
CASE VALTYPE(cDWORD) = "N" ; cDWORD := LTRIM(STR(cDWORD))
CASE VALTYPE(cDWORD) = "A" ; cDWORD := cDWORD[1]
OTHERWISE
cDWORD := ""
ENDCASE
APPEND BLANK
REPLACE SOW WITH "S"
REPLACE HKLM WITH cServer
REPLACE KEY WITH aServer[i][1]
REPLACE DWORD WITH cDWORD
REPLACE COMMENT WITH "found by Xbase++"
REPLACE ACTIVE WITH .T.
REPLACE ISTDWORD WITH cDWORD
REPLACE ORGDWORD WITH cDWORD
ENDIF
NEXT
iMax := LEN(aSMB )
FOR i = 1 TO iMax
cSeek := "T"+aSMB[i][1]
SEEK(UPPER(cSeek))
IF FOUND()
ELSE
cDWORD := GETREGKEY(cSMB,aSMB[i][1])
* cDWORD := HexToStr(cDWORD) // XBTBASE1.LIB
DO CASE
CASE VALTYPE(cDWORD) = "C"
CASE VALTYPE(cDWORD) = "N" ; cDWORD := LTRIM(STR(cDWORD))
CASE VALTYPE(cDWORD) = "A" ; cDWORD := cDWORD[1]
OTHERWISE
cDWORD := ""
ENDCASE
APPEND BLANK
REPLACE SOW WITH "T"
REPLACE HKLM WITH cSMB
REPLACE KEY WITH aSMB[i][1]
REPLACE DWORD WITH cDWORD
REPLACE COMMENT WITH "found by Xbase++"
REPLACE ACTIVE WITH .T.
REPLACE ISTDWORD WITH cDWORD
REPLACE ORGDWORD WITH cDWORD
ENDIF
NEXT
iMax := LEN(aWorkst)
FOR i = 1 TO iMax
cSeek := "W"+aWorkst[i][1]
SEEK(UPPER(cSeek))
IF FOUND()
ELSE
cDWORD := GETREGKEY(cWorkst,aWorkst[i][1])
* cDWORD := HexToStr(cDWORD) // XBTBASE1.LIB
DO CASE
CASE VALTYPE(cDWORD) = "C"
CASE VALTYPE(cDWORD) = "N" ; cDWORD := LTRIM(STR(cDWORD))
CASE VALTYPE(cDWORD) = "A" ; cDWORD := cDWORD[1]
OTHERWISE
cDWORD := ""
ENDCASE
APPEND BLANK
REPLACE SOW WITH "W"
REPLACE HKLM WITH cWorkst
REPLACE KEY WITH aWorkst[i][1]
REPLACE DWORD WITH cDWORD
REPLACE COMMENT WITH "found by Xbase++"
REPLACE ACTIVE WITH .T.
REPLACE ISTDWORD WITH cDWORD
REPLACE ORGDWORD WITH cDWORD
ENDIF
NEXT
RETURN NIL
FUNCTION WRITENOW(aEditcontrols)
LOCAL n, LenGets := len(aEditcontrols)
FOR n := 1 to LenGets
aEditcontrols[n]:getdata() // now VarBlock:GETdata()
aEditcontrols[n]:show() // let me see my VarBlock now
NEXT
RETURN NIL
FUNCTION SSCOPE(nNum,oBrowse)
DO CASE
CASE nNum = 1 ; SET SCOPE TO
CASE nNum = 2 ; SET SCOPETOP TO "S" ; SET SCOPEBOTTOM TO "T"
CASE nNum = 3 ; SET SCOPE TO "W"
ENDCASE
GO TOP
oBrowse:refreshAll()
RETURN NIL
//EOF
mussAADD(aKeys,{"W","A","UseOportunisticLocking" ,"0"})
Code: Alles auswählen
AADD(aKeys,{"W","A","UseOpportunisticLocking" ,"0"})