Konu: Uzak masa üstü bağlantısında kullanıcı sınırlaması
herkese slm
uzak masaüstü bağlantısında kullanıcı sınırlaması nasıl yapılabilir?
Giriş yapmadınız. Lütfen giriş yapın yada kayıt olun.
fox4um » Kodlama ve Komutlar » Uzak masa üstü bağlantısında kullanıcı sınırlaması
herkese slm
uzak masaüstü bağlantısında kullanıcı sınırlaması nasıl yapılabilir?
erdalyalçın,Kullanıcı sınırlamasından, Harddisk sürücüleri üzerindeki klasör ve dosyaların userler tarafından görüntülenmemesi,ancak izin verdiğin programların çalıştırılması olduğunu varsayarak,Windows server 2008 kullanan biri olarak ayarlarımı yazıyorum.(2003 server de de benzerdir.Daha önce görmüştüm ancak ben direk 2008 den başladığım için yerleri ve menü isimleri farklı olabilir.)Öncekikle her kişiye, Aktif direcoty kullanıcıları ve bilgisayarları menüsünden kullanıcı ve şifre oluşturuyorsun.Bende İnternet üzerinden erişim olduğundan Domain users ve remote desktop users gruplarınada her kişiyi üye olarak atadım.Daha sonra Server üzerindeki disk sürücüleri üzerine gelip sağtuş /Özellikler/güvenlik/ sekmesinde "Users" grubunu kaldırıp,"Everyone" grubunu ekleyip izinler kısmında tüm işaretleri kaldırıp "Yaz" izini veriyorum.Gerçi burada "Users" grubuna da bu işlem uygulansa belki aynı sonucu verebilir denemek lazım.
daha sonra İşletim sisteminin kurulu olduğu diskte "Kullanıcılar(USERS)" klasörü var.Buraya oluşturduğun her kullanıcı için profil açıyor.istediğin kullanıcıyı seçiyorsun.Desktop klasörüne istediğin programın kısa yolunu kopyalıyorsun.İstediğin programı o user masa üstünde görüyor ve kullanıyor.C yada D sürücüsünde herhangi bir klasörü incelemek isterse,Admin şifresi sorulduğundan sorun çözülmüş oluyor.Kullanıcı kendi masa üstünde ve kendi belgelerim klasöründe çalışmış oluyor.Umarım işini görür.İsteğimi tam olarak yazarsan,sanırım daha fazla yardımcı olabiliriz diye düşünüyorum.Kolay gelsin..
üstad bu söylediğin ayar lar sistemcinin yapması gerekenler ve bunu fabrikanın bilgi işlemi yapıyor
benim sorunum şu programı 5 kullanıcı olarak sattım.
normal networkteki kullanıcıların protect olayını program kontrol ediyor fiziksel olarak başka makina olduğu için.
ama müşteri uzak masa üstü bağlantısında 10 kullanıcı olarak kullanabiliyor.
çünkü ana makinatada programın çalışması ayarlandığında uzak masa üstüyle bağlanabilen tüm kullanıcılar programı orda kullanabiliyor.
anlatabildimmi ? yani müşterinin kendi sistemcisi var ve ona bağlı bana değil
ben programın protect algoritması konusunda öneri istiyorum.
sistem ayarlarını müşteriler hallettirirler. biz müdahale edemeyiz
üsdadım,şimdi olayı daha net anladım sanırım.Geçenlerde aynı olay bizim başımıza geldi.Şirket muhasebesinde kullanılan çok meşhur bir program 4 kullanıcılı olararak satın alınmış.Bizde var 14 kullanıcı ? eee ne yapacaz şimdi :-) ?
Hemen kurdum Programı Server 2008 e şakır şakır çalışıyor ayıptır söylemesi.Bence bu problem şu şekide çözülebilir.Programına muhtemelen user name ve şifre ile girdiriyorsundur.Bunları girerken bir yere yazsan ve aynı anda database yi kullanan kişileri saysan, kullanıcı sayısı örneğin 5 i geçtiğinde uyarsa? bizde bir program var adamlar bunu yapmış.Bence bu şekilde olabilir sen ne dersin?Diğer üsdatların görüşlerinde önemli tabiiki
Ben kullanici sinirlamak icin yapmiyorum ama her baglananin, network kart numarasi, makine adi, giris, cikis zamanlari ve o oturumlarina ait (ayni makineden birden fazla oturum acsa da her biri ayri) bir ID'yi sakliyorum. Sanirim sen bunu ayni anda acik olanlari saymak icin kullanabillirsin. Sunun gibi birsey:
* CREATE TABLE cnlog ;
* (NIC c(12), CName c(50), UNAME c(50), uptime t, downTime t null, uID c(38))
PUBLIC oApp
oApp = Createobject('myApp')
IF oApp.CountSessions() < 5
oApp.LogEntry(.T.)
ELSE
? "Kullanici kotasi dolu", oApp.CountSessions()
RETURN
endif
? "Kullanima izin verildi", oApp.CountSessions()
ON SHUTDOWN do appShutdown
*read events
PROCEDURE appshutdown
oApp.LogEntry() && exit
endproc
Define Class myApp As Custom
sessionID = .null.
Procedure LogEntry(tlEntry)
Local oSys,lcMacAddress,lcUserName,lcComputerName,ltTime,lcGUID
oSys = Createobject('sysutil')
lcMacAddress = oSys.getMac()
lcComputerName = Upper(oSys.ComputerName())
lcUserName = oSys.UserName()
ltTime=Datetime()
this.CloseOrphans(m.lcMacAddress, m.lcComputerName)
If m.tlEntry
lcGUID = oSys.getGUID()
Insert Into cnlog ;
(NIC, CName, UNAME, uptime, downtime, uID) ;
VALUES ;
(m.lcMacAddress, m.lcComputerName, m.lcUserName, m.ltTime,NULL, m.lcGUID)
* Create semaphore
this.IsAppRunning(Trim(m.lcGUID)) && Start semaphore
this.sessionID = m.lcGUID
Else
lcGUID = this.sessionID
Update cnlog Set downtime = m.ltTime Where uID = m.lcGUID
Endif
Endproc
Procedure CloseOrphans(m.tcMacAddress, m.tcComputerName)
Local Array aOpenSession[1]
Local ltTime
ltTime = Datetime()
Select uID From cnlog ;
WHERE NIC = m.tcMacAddress And CName = m.tcComputerName And downtime Is Null ;
INTO Array aOpenSession
If _Tally > 0
Local ix
For ix=1 To Alen(aOpenSession,1)
If !this.IsAppRunning(Trim(aOpenSession[m.ix,1])) && Check if it's already running
Update cnlog Set ;
downtime = m.ltTime, forced = .T. ;
WHERE uID = aOpenSession[m.ix,1]
Endif
Endfor
Endif
Endproc
Procedure IsAppRunning
Lparameters tcSemaphoreName
Local hsem, lpszSemName
#Define ERROR_ALREADY_EXISTS 183
Declare Integer GetLastError In win32API
Declare Integer CreateSemaphore In WIN32API ;
string @ lpSemaphoreAttributes, ;
LONG lInitialCount, ;
LONG lMaximumCount, ;
string @ lpName
hsem = CreateSemaphore(0,0,1,tcSemaphoreName)
Return (hsem # 0 And GetLastError() == ERROR_ALREADY_EXISTS)
Endproc
Procedure CountSessions
Local Array aOpenSessions[1]
Select Count(*) From cnlog Where downtime Is Null Into Array aOpenSessions
Return aOpenSessions
ENDPROC
Enddefine
Define Class sysutil As Custom
Procedure Init
This.initDLLs()
Endproc
Procedure initDLLs
Declare Integer WNetGetUser In win32api ;
string @ lpszLocalName, ;
string @ lpszUserName, ;
integer @ lpcchBuffer
Declare Integer GetComputerName In Win32API ;
STRING @ lpComputerName, Integer @ nBufSize
Declare Integer CoCreateGuid In 'OLE32.dll' ;
string @pguid
Declare Integer StringFromGUID2 In 'OLE32.dll' ;
string rguid, String @lpsz, Integer cchMax
Declare Integer UuidCreateSequential In 'RPCRT4.dll' String @ Uuid
Declare Integer UuidCreate In 'RPCRT4.dll' String @pguid
Endproc
Procedure getGUID
Local pguid,rguid
pguid=Replicate(Chr(0),16)
rguid=Replicate(Chr(0),80)
UuidCreate(@pguid)
StringFromGUID2(pguid,@rguid,40)
Return Strconv(Left(rguid,76),6)
Endproc
Procedure getMac
Local pguid,rguid,lcOldError,lnResult
pguid=Replicate(Chr(0),16)
rguid=Replicate(Chr(0),80)
lcOldError = On('error')
On Error lnResult = CoCreateGuid(@pguid)
UuidCreateSequential(@pguid)
On Error &lcOldError
StringFromGUID2(pguid,@rguid,40)
Return Substr( Strconv(Left(rguid,76),6), 26,12)
Endproc
Procedure UserName
Local lpszUserName,lpcchBuffer
lpszUserName = Space(100)
lpcchBuffer=100
Return Iif( WNetGetUser(0,@lpszUserName,@lpcchBuffer)=0,;
substr(lpszUserName,1,At(Chr(0),lpszUserName)-1),'' )
Endproc
Procedure ComputerName
Local lcComputerName,lnBufSize
Store Space(254) To lcComputerName
lnBufSize = 254
Return ;
iif ( GetComputerName(@lcComputerName,@lnBufSize) # 0 ,;
SUBSTR(m.lcComputerName,1,m.lnBufSize),'' )
Endproc
Enddefine
Akilli biri bunu rahat gecer ama bu sadece baslangic. Onlar akillliysa biz daha akilliyiz, duz null datetime yerine tum kayit sifrelenmis xml filan olabilir.
benim yıllardır kullandığım çok basit ve çok başarılı bir yöntem var:
5 kayıtlı bir tablo oluştur. giren kullanıcı sırayla ilk kayıttan itibaren 5 kayıttan birini kilitlemeye çalışsın. eğer başarırsa tamamdır yoksa çok fazla kullanıcı deyip dışarı atsın. programdan çıkmadığın sürece bu kaydın kilidini çözme. mesela eta-logo bu konuda bir field ın içeriğini değiştirir. ancak bilgisayarı düğmeden kapatınca düzeltme işlemi gerekir. benim yöntemde böyle birşey gereksiz.
etada ki o meşhur kulsay onun içinmiş demek. yıllarca kullsay ı çok anlamsız bulmuştum
fox4um » Kodlama ve Komutlar » Uzak masa üstü bağlantısında kullanıcı sınırlaması