1

Konu: sql deki gibi servisi durdurmak?

arkadaşlar mssql server daki gibi servisi durdurup (kullanıcıları bir mesaj verdikten sonra) datalara exculisive müdahale imkanı nasıl elde edebiliriz.

imkan yoksada en azından mesaj verdirdikten sonra çalışan exe yi otomotik kapatttırmak
nasıl yapılabilir?

2

Re: sql deki gibi servisi durdurmak?

Üsdadım Dediğin gibi birşey belki şöyle yapılabilir,Server makinada programın olduğu dizine basit bir txt dosyası kopyalanır(Bu dosya bahsi geçen dizinde varsa);

1-)Terminal Makinalardan (Program terminal tarafında kullanılıyorsa),Belli aralıklarla, txt dosyasının server üzerindeki yerinde olup olmadığı kontrol edilir.Varsa,Terminal bakım olacağını anlar ve bir uyarı mesajı ile kendini kapatır(programdan çıkar)tekrar çalıştırılmak istenirse,txt dosyası dizinde olduğundan,terminal de program çalışmayacaktır.

2-) Server O dosyayı gördüğünde veri tabanını exclusive açmaya çalışır(Tüm kullanıcılar sistemden düştüğünde açabilecektir) veri tabanı üzerinde istenilen işlem yapılır.İşlem bitince txt dosyası dizinden silinir..

Ben bu yöntemi otomatik database bakım işleminde kullanıyorum.Belki diğer üsdatlarında bu konuda fikirleri vardır.Ben acizane babadan kalma yöntemimi söyledim.Umarım fikir vermişimdir.

En büyük sermaye nakit,nakit sermaye vakittir...

3

Re: sql deki gibi servisi durdurmak?

Benim yaptigim Neyzen'inki gibi.

Makineler uygulamaya giris-cikis kayitlarini bir dosyaya yaziyor.
Bir tane Remote Shutdown formu var. Orada 10sn'de bir guncellenen gridde acik makineler listeleniyor. Ayrica kapatmalari icin su kadar sure ver, su kadar sure kapali kalacak, kapatma sekli (sadece uygulamadan cik, windows shut down, reboot) gibi seceneklerle 'Uzaktan Kaptmayi baslat' var. Kapatma baslatilirsa ortak bolumde bu bilgilerle bir XML dosyasi yaratiliyor.

Tum makineler ya timer ile ya da VFP9'da bindevent ile bu dosyanin yaratilip yaratilmadigina bakiyor. Yeni girenler zetn giriste bakiyor. Yaratildiysa icinden bilgileri okuyup kullaniciya "Su kadar surede, bilmem kac dakika icin kapatilacak. Sen kapat yoksa ben kapatirim' gibisinden mesaj veriyor. Belirtilen surede kendileri kapatmadiysa, kapatiliyor.

Kodu uzun ve birkac parcadan olusuyor:( Ana fikir boyle benim yaptigimda. Sonra bakim yapacak olan makine dosyalari exclusive alip alamadiginin kontrolu yapiyor. Alabiliyorsa bakim, alamiyorsa halen kullanimda olan dosyalar oldugunu belirityor vs (ne yazikki hersey iceriden kontrol edilemeyebilir, ornegin bir akilli uygulama disindan bir dosyayi acmistir, VFP ya da baska bir sekilde. Bunu engelleyen yontemler uygulanmadiysa yapacak birsey kalmiyor).

4

Re: sql deki gibi servisi durdurmak?

Çetin hocam gibi düşünmeye başladım sonunda sevindim valla :-)

En büyük sermaye nakit,nakit sermaye vakittir...

5

Re: sql deki gibi servisi durdurmak?

bazen biri programı normal kapatmıyor ve dosyalar da hala açık görülebiliyor. o zaman server'ı kapatıp açmaktan başka çare kalmıyor. novell'de bu durumdaki makinaları server'dan kapatabiliyordum ve server restart gerekmiyordu. windows'ta varsa da ben bilmiyorum yolunu.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

6

Re: sql deki gibi servisi durdurmak?

Windows'ta da ayni sey var ama ya server'da olacaksin ya da server'a remote desktop ile baglanacaksin.

7

Re: sql deki gibi servisi durdurmak?

üsdatlar madem windows server konusuna girdik,Windows 2000 yada 2003 server de ,Domain kullanmadan,serverde tanımlı her hangi bir cliente, paylaştırılan dizindeki dosyayı (dosyaları),okuma yazma izini verebilirmiyim.(database dosyalarını göremeyecek,kopyalayamayacak,ancak programı çalıştırabilecek) ? :-;

En büyük sermaye nakit,nakit sermaye vakittir...

8

Re: sql deki gibi servisi durdurmak?

Neyzen,
Yavas yavas tum ticari sirlarimi dokucem galiba:) Asagidaki kodun ne yaptigini sorma. Sordugunu yapiyor. Cok az kismini kestim, oralari hayal gucunle doldurursan olur:)

Visual Fox Pro
#Define LOGON32_PROVIDER_DEFAULT 0

#Define LOGON32_LOGON_INTERACTIVE       2
#Define LOGON32_LOGON_NETWORK           3
#Define LOGON32_LOGON_BATCH             4
#Define LOGON32_LOGON_SERVICE           5
#Define LOGON32_LOGON_UNLOCK            7
#Define LOGON32_LOGON_NEW_CREDENTIALS   9
 
Define Class Authenticator As Session
  IsAuthenticated = .F.
 
  Procedure Init
    This.APIDeclarations()
  Endproc
 
  Procedure ConnectData(tcDataPath)
    loInfo = This.GetAuthenticationInfo(m.tcDataPath)
    Local lcUNCPath
    lcUNCPath = This.LocalToUNCPath(m.tcDataPath)
    If This.Authenticate(;
        loInfo.UserName,;
        loInfo.Server,;
        loInfo.Password)
 
      Return m.lcUNCPath
    Else
      Return .Null.
    Endif
  Endproc
 
  Procedure SaveAuthenticationInfo(tcDataPath,tcUserName,tcServer,tcPassword)
    *...
  Endproc
 
  Procedure GetAuthenticationInfo(tcDataPath)
    *...
    Return oAuthentication
  Endproc
 
  Procedure APIDeclarations
    Declare Integer LogonUser In AdvApi32.Dll;
      string szUsername,;
      string lpszDomain,;
      string lpszPassword,;
      integer dwLogonType,;
      integer dwLogonProvider,;
      integer @phToken
 
    Declare Integer ImpersonateLoggedOnUser In AdvApi32.Dll Integer hToken
    Declare Integer RevertToSelf In AdvApi32.Dll
    Declare Integer WNetGetUniversalName In win32API ;
      string @ lpLocalPath, ;
      integer dwInfoLevel,  ;
      string @ lpBuffer,  ;
      integer @ lpBufferSize
 
    Declare Integer GetLongPathName In win32API ;
      string @ lpszShortPath, String @ lpszLongPath, Integer cchBuffer
  Endproc
 
  Procedure Authenticate(tcUserName,tcServer,tcPassword)
    Local nToken,llSuccess
    nToken = 0
 
    llSuccess = LogonUser(m.tcUserName,    m.tcServer,    m.tcPassword,;
      LOGON32_LOGON_NEW_CREDENTIALS, ;
      LOGON32_PROVIDER_DEFAULT, @nToken) != 0 And ;
      ImpersonateLoggedOnUser(nToken) != 0
    This.IsAuthenticated = m.llSuccess
    Return m.llSuccess
  Endproc
 
  Procedure LocalToUNCPath(tcPath)
    #Define ERROR_MORE_DATA 234
 
    #Define UNIVERSAL_NAME_INFO_LEVEL   0x00000001
    #Define REMOTE_NAME_INFO_LEVEL      0x00000002
 
    Local lpLocalPath, lpBufSize,lpBuffer,lpszLongPath,lnResult, lcInfo,lnBuf
    lpLocalPath = m.tcPath
 
    lpBufSize = 512
    Store Space(512) To lpBuffer,lpszLongPath
    lnResult = WNetGetUniversalName(@lpLocalPath,REMOTE_NAME_INFO_LEVEL ,@lpBuffer,@lpBufSize)
    If lnResult = ERROR_MORE_DATA && Buffer was small -retry with new bufsize
      Store Space(m.lpBufSize) To lpBuffer,lpszLongPath
      lnResult = WNetGetUniversalName(@lpLocalPath,REMOTE_NAME_INFO_LEVEL ,@lpBuffer,@lpBufSize)
    Endif
    Do Case
      Case lnResult=0
        lcInfo =  Substr(m.lpBuffer,13)
        Alines(arrInfo, m.lcInfo, 1, Chr(0))
        Return arrInfo[1]
      Otherwise && Assume local path
        lnBuf = GetLongPathName(@lpLocalPath, @lpszLongPath, m.lpBufSize)
        Return Substr(m.lpszLongPath,1,m.lnBuf)
    Endcase
    Return m.tcPath
  Endproc
 
  Procedure Detach
    RevertToSelf()
  Endproc
Enddefine

Ipucu:      UserName,Server,Password deki Server domain olmak zorunda degil. Biribirine bagli iki XP'de baglanmak istedigin digerinin adi da olur:

"cetinbasoz","digerXPMakine","digerXPdeki_cetinbasoz_passwordu"