PDA

View Full Version : سوال: دسترسی به فایلهای یک پوشه شیر نشده در شبکه



ehsanvb
شنبه 09 شهریور 1392, 10:23 صبح
سلام خدمت اساتید

من یک برنامه دبیرخانه نوشتم که نامه ها رو اسکن میکنه و در سرور ذخیره میکنه و هر کاربر یه سطح دسترسی خاص خودش داره
برای نمایش اسناد هم ازاین کد استفاده میکنم :

Me.PictureBox1.Load("\\192.168.5.123\asnad\1.jpg")

حالا یه مشکل اینجا پیش اومده، اونم اینه که:

اگه پوشه ای که اسناد در اون ذخیر میشه رو شیر کنم همه افراد میتونن فایلها رو ببینن و یا حتی تغییر بدن
اگه پوشه رو شیر نکنم اجازه نمایش فایلها در برنامه به من داده نمیشه !!

لطفا اگه راهی به ذهن دوستان میرسه که قطعا هم میرسه راهنمایی کنن ممنون میشم :لبخندساده:

farbod61
شنبه 09 شهریور 1392, 14:10 عصر
پیشنهاد میکنم موقع ذخیره کردن اسم فایل رو همراه با سطح دسترسی که براش تعریف میکنید ( مثلا گروه کاربران) ( گروه مدیران) و ... رو تو یک دیتابیس ذخیره کنید
موقع لود کردن هم با توجه به اسم فایلی که قراره لود بشه از دیتابیس اطلاعات سطح دسترسی رو لود کنید و اگه مجاز بود نمایش بدید اگه نبود که پیغام بده

ehsanvb
شنبه 09 شهریور 1392, 14:37 عصر
فربد جان ممنون ازجوابت

ولی مشکل من با دسترسی از داخل برنامه نیست

مشکلم بااینه که اگه پوشه عکسهامو تو سرور شیر کنم اونوقت همه حتی بدون اجرای نرم افزار میتونن کل عکسها رو ببینن و تغییر بدن

اگر هم پوشه رو شیر نکنم اونوقت از طریق برنامه نمیتونم بهش دسترسی پیدا کنم

farbod61
شنبه 09 شهریور 1392, 14:52 عصر
آهان
الان متوجه شدم منظورتون رو
درسته
تا اونجایی که منم میدونم عکس رو بخوای تو از سرور تو یه کامپیوتر لود کنی و ببینی باید حتما دسترسی Read داشته باشی که اگه دسترسی رید داشته باشه با یه مپ نتورک یا ریموت میتونه کاربر ببینه عکسارو
توی کامپیوتری هم که باهاش عکسارو ذخیره میکنی باید دسترسی رایت هم داشته باشی
نمیدونم
فکری به ذهنم نمیرسه

ehsanvb
شنبه 09 شهریور 1392, 15:25 عصر
بهرجال متشکرم از جوایت

دوستان دیگه اگه فکری به ذهنشون میرسه ممنون میشم اگه راهنمایی کنن

خودم یه سرچی زدم ظاهرا یه روش هست به نام impersonation ولی مثال قابل فهم و قابل استفاده ای ازش پیدا نکردم

FastCode
یک شنبه 10 شهریور 1392, 05:06 صبح
impersonation روش نیست عزیزم.احتمالا یکی از نقاط ضعف روشی بوده که خوندید.
برای این کار چند تا روش پیشنهاد میشه:
۱.نوشتن پروتوکل خودتون با چند کتابخونه آماده مثل ServiceStack و proto-buffers
۲.استفاده از Marshaling(MarshalByRefObject)
۳.استفاده از یک وب سرویس با BasicAuthentication و در صورت نیاز SSL
اگر اینها کافی نیست بگید چند تا دیگه بگم.چیزی که زیاده راهه.

ehsanvb
یک شنبه 10 شهریور 1392, 09:28 صبح
impersonation روش نیست عزیزم.احتمالا یکی از نقاط ضعف روشی بوده که خوندید.
برای این کار چند تا روش پیشنهاد میشه:
۱.نوشتن پروتوکل خودتون با چند کتابخونه آماده مثل ServiceStack و proto-buffers
۲.استفاده از Marshaling(MarshalByRefObject)
۳.استفاده از یک وب سرویس با BasicAuthentication و در صورت نیاز SSL
اگر اینها کافی نیست بگید چند تا دیگه بگم.چیزی که زیاده راهه.

FastCode جان من مثل شما Fast و حرفه ای نیستم، از اینا هم سر در نیاوردم
من فقط میخوام به یه روش برسم که بتونم به فایلهای یک پوشه که در شبکه شیر نشده دسترسی پیدا کنم که فقط برنامه بتونه ببیندشون نه کاربران ویندوز

FastCode
یک شنبه 10 شهریور 1392, 11:47 صبح
جست و جو کردید؟
بعضی چیزها راحت به دست نمیاد.

ehsanvb
یک شنبه 10 شهریور 1392, 14:04 عصر
جست و جو کردید؟
بعضی چیزها راحت به دست نمیاد.

بله اگر از جستجو به نتیجه میرسیدم که وقت اساتید رو نمیگرفتم و خودم هم زودتر به نتیجه میرسیدم

r. salehi
یک شنبه 10 شهریور 1392, 18:48 عصر
سلام
ببینید من هم دقیقا چند وقت پیش برای ایجاد همچین برنامه ای برای نامه ها و نقشه ها در شرکت با همین مسئله روبه رو بودم. تقریبا تمام راه هایی که وجود داشت را در موردشون تحقیق کردم.
بهترین راه حلی که پیدا کردم که تونست تمام نیازهای من را براورده کنه استفاده از File Stream در SQL 2008 به بعد بود.
با این قابلیت SQL شما قادر خواهید بود فایلهای نامه، عکس نقشه و یا هر چیز دیگه ای را بدون اینکه در سرعت بانک اطلاعاتی تاثیر بگذاره با امنیت کامل در اختیار کاربران مختلف قرار بدید. سرعت خواندن و نوشتن فایل در SQL با این روش با سرعت NTFS یا همون هارد کامپیوتر تقریبا برابره. تفاوت این دو در سرعت اصلا محسوس نیست.
من تقریبا یک ماه زمان صرف کردم تا به روش File Stream رسیدم و باید بگم همه چیزهایی را که می خواستم را براورده کرد.
امیدوارم تونسته باشم کمکی بکنم

ehsanvb
یک شنبه 10 شهریور 1392, 21:38 عصر
صالحی عزیز ممنون از راهنماییت

واقعا یعنی این روش تو سرعت و استفاده از منابع تاثیر نداره؟!

اگه تعداد فایلها زیاد بشه و حجم اس کیو ال زیاد بشه چی بازم باعث کندی نمیشه؟ (البته انگار تو این روش فایلها توی دیتابیس ذخیره نویشه و مستقیم روی هارد ذخیره میشه، درست میگم؟)

اگه بتونی منابعی که این روش رو یاد گرفتی معرفی کنی یا سورس نمونه ای رو برام بذاری خیلی ممنونت میشم :لبخندساده:

متشکرم

r. salehi
دوشنبه 11 شهریور 1392, 02:41 صبح
سلام مجدد
ببینید من هم نگرانی سرعت بانک را داشتم اما وقتی دیدم که File Stream دقیقا چه کاری می کنه خیالم راحت شد.
ببینید شما یک فولدر درست می کنید و فایلهای خودتون را در اون قرار می دید و با توجه به اسم فایل اون را فراخونی می کنید. خوب File Stream هم دقیقا همین کار را انجام میده با این تفاوت که اسم فایل را با یک کد یونیک (یگانه) عوض میکنه و اسم یونیک را در جدول قرار میده. در واقع خود فایلها در جدوال SQL ذخیره نمی شوند که مشکلی برای سرعت بانک ایجاد کنه. علاوه بر این SQL ارتباط بین فیلد حاوی اسم فایل را با محل فایل خودش مدیریت می کنه و اجازه دسترسی دیگران را به فولدر فایلهای ذخیره شده نمیده. در عوض از طریق مجوز های صادر شده در بانک فایلها را به کاربر تحویل میده. در این حالت دیگه شما مشکل سرعت بانک را نخواهید داشت. البته ترافیک شبکه به قوت خودش باقی خواهد ماند که بحث دیگه ای هست و ربطی به سرعت بانک نداره.
پس در این شرایط شما تمام قابلیتهای امنیتی که در جداول SQL وجود داره را به راحتی برای فایلهای خودتون هم بدست خواهید آورد.
در SQL 2012 اگر اشتباه نکنم این قابلیت اضافه هم اضافه شده که وقتی شما یک فایل دلخواه را در این فولدر کپی می کنید فایل به صورت خودکار در جدول SQL در یک رکورد جدید ثبت خواهد شد. عالیه مگه نه؟
سورس هم براتون میگذارم

ehsanvb
دوشنبه 11 شهریور 1392, 17:11 عصر
سلام مجدد
ببینید من هم نگرانی سرعت بانک را داشتم اما وقتی دیدم که File Stream دقیقا چه کاری می کنه خیالم راحت شد.
ببینید شما یک فولدر درست می کنید و فایلهای خودتون را در اون قرار می دید و با توجه به اسم فایل اون را فراخونی می کنید. خوب File Stream هم دقیقا همین کار را انجام میده با این تفاوت که اسم فایل را با یک کد یونیک (یگانه) عوض میکنه و اسم یونیک را در جدول قرار میده. در واقع خود فایلها در جدوال SQL ذخیره نمی شوند که مشکلی برای سرعت بانک ایجاد کنه. علاوه بر این SQL ارتباط بین فیلد حاوی اسم فایل را با محل فایل خودش مدیریت می کنه و اجازه دسترسی دیگران را به فولدر فایلهای ذخیره شده نمیده. در عوض از طریق مجوز های صادر شده در بانک فایلها را به کاربر تحویل میده. در این حالت دیگه شما مشکل سرعت بانک را نخواهید داشت. البته ترافیک شبکه به قوت خودش باقی خواهد ماند که بحث دیگه ای هست و ربطی به سرعت بانک نداره.
پس در این شرایط شما تمام قابلیتهای امنیتی که در جداول SQL وجود داره را به راحتی برای فایلهای خودتون هم بدست خواهید آورد.
در SQL 2012 اگر اشتباه نکنم این قابلیت اضافه هم اضافه شده که وقتی شما یک فایل دلخواه را در این فولدر کپی می کنید فایل به صورت خودکار در جدول SQL در یک رکورد جدید ثبت خواهد شد. عالیه مگه نه؟
سورس هم براتون میگذارم

سلام ، آره روش خیلی جالبیه
در واقع همونیه که من دنبالشم

یه سوال : آیا در بکاپ گیری از دیتابیس از فایل ها هم بک آپ گیری میکنه؟

اگه یه سورس گویا هم بذاری که خیلی کمکم کردی :تشویق:

r. salehi
دوشنبه 11 شهریور 1392, 22:54 عصر
Imports System.IO
Imports System.Data.SqlClient
Imports System.Data.SqlTypes

Public Class ucLetterView
Private kCS As String = My.Settings.SMSAConnectionString '"Data Source=(local)\SQL2008;Initial Catalog=TestFileStream;Integrated Security=True"
' Dim LeterViewTap As New DataSet1DocTableAdapters.NewTableTableAdapter
' Dim LeterViewDat As New DataSet1Doc.NewTableDataTable
Private Declare Function ShellEx Lib "shell32.dll" Alias "ShellExecuteA" ( _
ByVal hWnd As Integer, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Integer) As Integer



Dim connection As SqlConnection


Private Sub ucLetterView_Load(sender As Object, e As EventArgs) Handles Me.Load
' LeterViewTap.Fill(LeterViewDat)
' Dim qFile = (From k In LeterViewDat Select k.FileName, k.FileExtension).ToList
' DGV1.DataSource = qFile

'Add Button Starts

Dim dgButtonColumn As New DataGridViewButtonColumn
dgButtonColumn.HeaderText = ""
dgButtonColumn.UseColumnTextForButtonValue = True
dgButtonColumn.Text = "Open"
dgButtonColumn.Name = "OpenFile"
dgButtonColumn.ToolTipText = "View File"
dgButtonColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCellsExcep tHeader
dgButtonColumn.FlatStyle = FlatStyle.System
' dgButtonColumn.DefaultCellStyle.BackColor = Color.Gray
' dgButtonColumn.DefaultCellStyle.ForeColor = Color.White
DGV1.Columns.Add(dgButtonColumn)
End Sub



Private Sub btnRefreshList_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefreshList.Click
Dim dr As SqlDataReader = GetFileList()
Dim tb As DataTable = New DataTable("Files")
tb.Load(dr)
DGV1.DataSource = tb
End Sub

Private Function GetFileList() As SqlDataReader
Dim cn As New SqlConnection(kCS)
Dim cmd As New SqlCommand("SELECT INTID, [Name], FileType FROM Files", cn)

cn.Open()
Return cmd.ExecuteReader(CommandBehavior.CloseConnection)
End Function

Private Sub btnBrowseUpload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowseUpload.Click
Dim dlg As New OpenFileDialog
With dlg
.Title = "Select a file to upload"
If .ShowDialog = Windows.Forms.DialogResult.OK Then
txtFileUpload.Text = .FileName
End If
.Dispose()
End With
End Sub

Private Sub btnBrowseDownload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowseDownload.Click
Dim dlg As New SaveFileDialog
With dlg
.Title = "Select a save location"
If .ShowDialog = Windows.Forms.DialogResult.OK Then
txtFileDownload.Text = .FileName
End If
.Dispose()
End With
End Sub

Private Sub btnUpload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpload.Click
'Validate that the file exist
If Not IO.File.Exists(txtFileUpload.Text) Then
MessageBox.Show("The file you selected is invalid")
Return
End If

AddNewFile(txtFileUpload.Text)
btnRefreshList.PerformClick()
End Sub

Private Function AddNewFile(ByVal pFile As String) As Guid
'fill some variables with values
Dim ID As Guid = Guid.NewGuid
Dim strFileName As String = IO.Path.GetFileName(pFile)

Dim FileExt As String = IO.Path.GetExtension(txtFileUpload.Text)
Dim FileExtentionLengh As SqlInt16 = Len(FileExt) - 1
Dim FileExtention As String = Microsoft.VisualBasic.Right(FileExt, FileExtentionLengh)

TextBox1.Text = FileExtention

'open a connection
Dim cn As New SqlConnection(kCS)
cn.Open()

'insert the new row
Dim cmd As New SqlCommand("INSERT INTO Files ([ID], [Name], FileType) VALUES (@ID, @Name, @Extention)", cn)
cmd.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = ID
cmd.Parameters.Add("@Name", SqlDbType.VarChar, 20).Value = strFileName
cmd.Parameters.Add("@Extention", SqlDbType.VarChar, 6).Value = FileExtention
cmd.ExecuteNonQuery()

'retreive the context of the transaction and the pathname
Dim trx As SqlTransaction = cn.BeginTransaction
cmd = New SqlCommand("SELECT [Data].PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() " + _
"FROM Files " + _
"WHERE ID = @ID", cn)
cmd.Transaction = trx
cmd.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = ID
Dim rdr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleRow)
rdr.Read()
Dim strfilePath As String = rdr.GetString(0)
Dim trxID As Byte() = DirectCast(rdr(1), Byte())
rdr.Close()

'insert the file into SQL FileStream field
Using fs As IO.FileStream = IO.File.OpenRead(pFile)
Using sqlFS As New SqlTypes.SqlFileStream(strfilePath, trxID, IO.FileAccess.Write)
Dim buffer As Byte() = New Byte(512 * 1024) {}
Dim intPos As Integer = fs.Read(buffer, 0, buffer.Length)
Do While intPos > 0
sqlFS.Write(buffer, 0, intPos)
intPos = fs.Read(buffer, 0, buffer.Length)
Loop
End Using
End Using

trx.Commit()
cn.Close()

Return ID
End Function

Private Sub btnDownload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDownload.Click
If String.IsNullOrEmpty(txtFileDownload.Text) Then
MessageBox.Show("You first need to select an output location")
Return
End If

If String.IsNullOrEmpty(DGV1.Item("ID", DGV1.CurrentRow.Index).Value.ToString) Then
MessageBox.Show("You need to select a row")
Return
End If

Dim ID As Guid = New Guid(DGV1.Item("ID", DGV1.CurrentRow.Index).Value.ToString)
ExportFileToDisk(ID, txtFileDownload.Text)

MessageBox.Show("File downloaded from SQL")
End Sub

Private Sub ExportFileToDisk(ByVal pID As Guid, ByVal pFileName As String)
Dim cn As New SqlConnection(kCS)
cn.Open()

'retreive the context of the transaction and the pathname
Dim trx As SqlTransaction = cn.BeginTransaction()
Dim cmd As New SqlCommand("SELECT [Data].PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() " + _
"FROM Files " + _
"WHERE ID = @ID", cn)
cmd.Transaction = trx
cmd.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = pID
Dim rdr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleRow)
rdr.Read()
Dim strFilePath As String = rdr.GetString(0)
Dim trxID As Byte() = DirectCast(rdr(1), Byte())
rdr.Close()

'pull data down from the SQL into a buffer, then hand it off to the local file.
Using fs As IO.FileStream = IO.File.OpenWrite(pFileName)
Using sqlFS As New SqlTypes.SqlFileStream(strFilePath, trxID, IO.FileAccess.Read)
Dim buffer As Byte() = New Byte(512 * 1024) {}
Dim intPos As Integer = sqlFS.Read(buffer, 0, buffer.Length)
Do While intPos > 0
fs.Write(buffer, 0, intPos)
intPos = sqlFS.Read(buffer, 0, buffer.Length)
Loop
End Using
End Using

trx.Commit()
cn.Close()
End Sub

Private Sub DGV1_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV1.CellContentClick
Dim strSql As String = ""

Dim connection As SqlConnection = New SqlConnection(kCS)
Try
Select Case e.ColumnIndex
Case Is > -1
If sender.Columns(e.ColumnIndex).Name = "OpenFile" Then

Dim FileExtensionDGV As String = DGV1.Rows(e.RowIndex).Cells("FileType").Value
Select Case DGV1.Rows(e.RowIndex).Cells("FileType").Value
Case FileExtensionDGV
downLoadFile(DGV1.Rows(e.RowIndex).Cells("INTID").Value, DGV1.Rows(e.RowIndex).Cells("Name").Value, DGV1.Rows(e.RowIndex).Cells("FileType").Value)
End Select

End If

End Select
Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try

End Sub


Private Sub downLoadFile(ByVal iFileId As Int16, ByVal sFileName As String, ByVal sFileExtension As String)
Dim strSql As String
connection = New SqlConnection(kCS)
connection.Open()
'For Document
Try
'Get image data from gridview column.
strSql = "Select Data from Files WHERE INTID=" & iFileId

Dim sqlCmd As New SqlCommand(strSql, connection)

'Get image data from DB
Dim fileData As Byte() = DirectCast(sqlCmd.ExecuteScalar(), Byte())

Dim sTempFileName As String = Application.StartupPath & "\" & sFileName

If Not fileData Is Nothing Then
'Read image data into a file stream
Using fs As New FileStream(sFileName, FileMode.OpenOrCreate, FileAccess.Write)
fs.Write(fileData, 0, fileData.Length)
'Set image variable value using memory stream.
fs.Flush()
fs.Close()
End Using

'Open File
' 10 = SW_SHOWDEFAULT
ShellEx(Me.Handle, "Open", sFileName, "", "", 10)
End If

Catch ex As Exception
MsgBox(ex.Message)
End Try

End Sub
End Class






110088
110089


این یک مثال ساده است که تمام نیازهای برنامه نویسی شما را بر طرف می کنه و بنا به نیاز خودتون میتونید تغییرش بدید. در ضمن DGV هم همون دیتاگرید ویو ویژاول بیسیکه.
http://barnamenevis.org/images/misc/pencil.pngفقط به خاطر داشته باشید که قبلش باید در SQL فایل استریم را فعال کنید روش این کار را هم در اینترنت به راحتی می تونید پیدا کنید.
در ضمن همون طوری که قبلا گفتم فایل استریم از SQL2008 به بعد قابل استفاده هست.
موفق باشید

r. salehi
دوشنبه 11 شهریور 1392, 23:21 عصر
این هم نمایی از حالت اجرای نرم افزار.
با این روش شما هر فایلی با هر فرمتی را میتونید در اس کیو ال با امنیت کامل ذخیره و بازیابی کنید.

110091

ehsanvb
سه شنبه 12 شهریور 1392, 11:51 صبح
آقا متشکر از مثال

من در SQL فایل استریم را فعال کردم

ولی من هرکاری کردم نتونستم این ارور رو برطرف کنم

توی این خط
Dim rdr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleRow)

این ارور رو میده :
Function PathName is only valid on columns with the FILESTREAM attribute.

هرچی جستجو کردم و تلاش کردم نفهمیدم از چیه!!!

نمیدونم کجا رو اشتباه کردم.

اگه ممکنه راهنمایی بفرمایید

متشکرم.

r. salehi
سه شنبه 12 شهریور 1392, 12:49 عصر
جدول اس کیو ال را ساختین مطابق عکسی که براتون فرستادم؟

ehsanvb
سه شنبه 12 شهریور 1392, 13:13 عصر
بله ساختم

اینم عکسش :

110106

به جز این تنظیمات ظاهری تنظیم دیگه ای هم توی column properties باید انجام بدم ؟

hedi
سه شنبه 12 شهریور 1392, 20:11 عصر
با سلام به شما دوست عزيز
تمامی روش های که دوستان پيشنهاد و ارائه کردند تجربه عملی آنها در پروژه های خودشان می باشد همان طوری که یک قرص درد یک نفر را درمان می کند دلیل نمی شود که آن قرص هم درد شما را درمان کند شما از همان روشی که اقدام کرديد بسیار صحيح عمل کرده اید فقط متاسفانه البته جسارت به شما و دوستان نمی کنم بعضی از افراد را مشاهده می کنم که با کمترين تجربه ای از سیستم عامل و شبکه پا در پروژه هایی می گذارند که بايد بعنوان پيش نياز حتما در شبکه و سيستم عامل تسلط نسبی داشته باشند .
با توجه به اين که برنامه را نوشته ايد و در این گام از برنامه به مشکل خورده اید نباید کل پروژه را دسخوش تغييرات جدی نماييد به هر حال من هم روش ذخيره اطلاعات فايلی را در اين گونه موارد خاص که فايل ها از اهميت برخوردار هستند را توصيه نمی کنم .
شما برای اين کار بايد از يک سيستم سرور که خودتان عنوان کرديد 192.168.5.123 استفاده کنيد اما اين روش شما هيج ربطی به برنامه نويسی ندارد بلکه با استفاده از یکی از نسخه های سرور ويندوز 2003 یا 2008 اقدام به نصب بر روی سرور می نماييد پشت بند نصب حتما ActiveDirectory را نصب و Domain را به نام دلخواه خود تعريف می کنيد که بعد به جايي این که در کد سورس خود IP را ذکر کنيد نام کامپيوتر را بزنيد در خصوص Share هم فقط کافی است سطح دسترسی کاربران را به Drive مربوطه که قرار است تعيين نماييد و فقط Drive را Share می کنید (البته اگر حرفه ای تر هم باشيد نيازی به Share Drive هم نيست ) بعد اگر Client ها از ويندوز XP یا 7 استفاده می کنند چون شما برای آنها در ActiveDirectory کاربری تعريف کرديد ابتدا آن سيستم عامل را به Domain متصل کرده و سپس جهت Login در client نام دامين و سپس نام کاربری تعريف شده به همراه پسورد را زده و بالا می آييد توجه داشته باشيد که کاربر شما سطح دسترسی به Drive را دارد و چون سطح دسترسی به درایو را دارد نرم افزار می تواند براحتی به آن پوشه مورد نظر دسترسی پيدا کند بدون اين که نياز به Share باشد و فقط کاربران تعريف شده این امکان را دارند کاربران دیگری که تعريف نشده باشند دسترسی به سرور را در صورتی دارند که پسورد را بدانند حالا برای امنيت پوشه ای هم که کسی نمی بيند ولی شما از طريق برنامه به آن دسترسی داريد بايد از توابعی استفاده کنيد که به منظور Security پوشه با سيستم عامل در ارتباط است من نمی تونم بيشتر اين روش را باز کنم چون اين کار را بايد به صورت حضوری انجام دهم تا با روش کار آشنا شويد ولی اين روش را من در ادارات استفاده کردم و قطعی هم نتيجه گرفتم بدون کوچکترين خطای امنيتی . البته من تمامی روش را گفتم توجه داشته باشيد که اين روش کاملا عملی است فقط کافی که با سيستم عامل و شبکه و البته توابعی که برای تعيين سطح دسترسی به فولدرها مورد استفاده قرار می گیرد آشنايي داشته باشيد .
در خصوص روش ذخيره فايل ها در SQL هم بايد بگم اين روش را هم روش خوبی است اما متدهای استفاده از آن به جهت ذخيره و بازيابی اسناد فوق العاده مهم می باشد چون اطلاعات بعد از ذخيره در بانک اطلاعاتی به صورت باينری ذخيره می شوند و اگر روش صحيحی برای ذخيره استفاده نکنيد مطمئن باشيد در بازيابی به مشکل می خوريد و حتی در برخی از موارد که فايل ها حجيم باشد در صد خطا افزايش پيدا می کند . ولی امنیتش فوق العاده است . روشی هم که من گفتم کاربردی تر و امنيتش به صورت مسقيم با ActiveDirectory و User ها به منظور دسترسی توسط نرم افزار انجام می شود ... انشاء ا... که از هر روشی استفاده می کنيد موفق باشيد ...

ehsanvb
چهارشنبه 13 شهریور 1392, 08:06 صبح
باسلام خدمت hedi عزیز

از دقتی که نسبت به مطلب داشتید و وقتی که برای پاسخگویی گذاشتید تشکر میکنم

شما درست میفرمایید، من توی شبکه تسلط کامل ندارم ولی لوازم ابتدایی مثل ویندوز سرور 2003 و اکتیو دایرکتوری و دامین رو نصب کردم و دارم استفاده میکنم ، البته مطلبی رو که جناب صالحی عزیز فرمودند رو بدلیل اینکه سرورم اس کیو ال 2003 داشت روی کامپیوتر خودم تست کردم و به اون ارور برخوردم



فقط Drive را Share می کنید (البته اگر حرفه ای تر هم باشيد نيازی به Share Drive هم نيست )

جناب hedi مشکل من هم دقیقا همینجاست که اگر یک درایو یا پوشه رو Share کنم علاوه بر برنامه کاربران ویندوز بدون باز کردن برنامه هم میتونن بهش دست پیدا کنن ، ولی شما فرمودید که : البته اگر حرفه ای تر هم باشيد نيازی به Share Drive هم نيست . ممکن یه راهنمایی در این خصوص بفرمایید (البته روش نام درایو بعلاوه $ را میدونم ولی بعلت اینکه باید با ادمین لاگین بود درست نیست)
باتشکر از دقت نظر شما

hedi
چهارشنبه 13 شهریور 1392, 17:22 عصر
(البته روش نام درایو بعلاوه $ را میدونم ولی بعلت اینکه باید با ادمین لاگین بود درست نیست)

همان طور که در پست قبلی ذکر کردم شما بايد با توابعی که برای تعيين سطح دسترسی به فولدرها مورد استفاده قرار می گیرد آشنايي داشته باشيد . حالا یک مثال می زنم چنانچه سطح دسترسی کاربران به درایو فعال باشد این بدان منظور نیست که به کل پوشه ها هم دسترسی دارد و می تواند آن ها را مورد تغيير و تحول قرار دهد اگر Client های شما از ويندوز 7 استفاده می کنند روش را بدين صورت دنبال می کنم که ابتدا به ساکن به بخش Network and Sharing Center مراجعه کرده و گزينه Advanced sharing settings را انتخاب می کنيد در انتهای همان صفحه گزينه Turn Off Password Protected sharing را فعال می کنيد این حرکت باعث می شود که کاربران نیاز به زدن Password برای دسترسی به رایانه های هم نداشته باشند و بدون نیاز به Share درايو آنها را در دسترس دارند اما به هيچ عنوان نمی توانند به پوشه ها وارد یا اطلاعات آنها را حدف کنند(چون بايد برای ورود به پوشه ها کاربر رایانه متقاضی بايد سطح دسترسی را برای شما فراهم کند) البته برای دسترسی به درایو هم کاربر بايد نام درایو + $ را هم که شما فرموديد تازه بداند اما بحث سطح امنيتی پوشه ها اين است که شما چنانچه بخواهيد یک Folder را در اختيار کاربرتان قرار دهيد بايد توسط نرم افزار خودتان و زمانی که فرم جاری برنامه برای عمليات دسترسی به پوشه فعال است مجوز دسترسی را تعيين کرده و با بستن فرم و یا غير فعال شدن فرم بلافاصله مجوز را لغو می کنيد که اگر کاربر حرفه ای هم باشد و بخواهد از طريق Explorer به مسیر دسترسی داشته باشد کاری را نتواند انجام دهد بحث Security پوشه ها را حتما دنبال کنيد و با استفاده از توابع مربوطه که در زبان VB بدين منظور تعبيه شده براحتی می توانيد اين روش را پياده سازی کنيد . البته روش های ديگری هم بود اما چون شما برنامه تان را بر اين مبنا درست کرده بوديد من نزديکترين روش را پيشنهاد کردم . موفق باشيد

ehsanvb
شنبه 16 شهریور 1392, 09:13 صبح
اما بحث سطح امنيتی پوشه ها اين است که شما چنانچه بخواهيد یک Folder را در اختيار کاربرتان قرار دهيد بايد توسط نرم افزار خودتان و زمانی که فرم جاری برنامه برای عمليات دسترسی به پوشه فعال است مجوز دسترسی را تعيين کرده و با بستن فرم و یا غير فعال شدن فرم بلافاصله مجوز را لغو می کنيد که اگر کاربر حرفه ای هم باشد و بخواهد از طريق Explorer به مسیر دسترسی داشته باشد کاری را نتواند انجام دهد بحث Security پوشه ها را حتما دنبال کنيد و با استفاده از توابع مربوطه که در زبان VB بدين منظور تعبيه شده براحتی می توانيد اين روش را پياده سازی کنيد .

دوستان عزیز کل مشکل من هم اینجاست

چه جوری فقط و فقط توسط برنامه به شبکه و پوشه داخل شبکه دسترسی پیدا کنم به طوری که خود برنامه لاگین کنه و دسترسی پیدا کنه و کاربر از طریق ویندوز و Explorer و ... نتونه به پوشه های مورد نظر برسه،

خسته شدم اینقدر گشتم تو سایتها :گریه: لطفا یکی کمک کنه

ehsanvb
چهارشنبه 29 آبان 1392, 08:14 صبح
با تشکر از تمام دوستان و اساتیدی که راه حل های مختلف ارائه کردن (بخصوص r. salehi با اون آموزش عالی که رائه دادن)

بالاخره اون روشی رو که میخواستم عملی کردم.

لینک آموزشش رو هم میذارم برای دوستانی که با جستجو به اینجا رسیدن

امیدوارم بدردشون بخوره :

http://barnamenevis.org/showthread.php?428050-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%86%D8%AD%D9%88%D9%87-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D9%87-%DB%8C%DA%A9-%D9%BE%D9%88%D8%B4%D9%87-%D8%B4%DB%8C%D8%B1-%D8%B4%D8%AF%D9%87-%D8%AF%D8%B1-%D8%A8%D8%A7-%DB%8C%D9%88%D8%B2%D8%B1%DB%8C-%D9%85%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A8%D8%A7%D8%A2%D9%86%DA%86%D9%87-%D8%A8%D9%87-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-%D9%88%D8%A7%D8%B1%D8%AF%D8%B4%D8%AF%DB%8C%D8%AF(i mpersonate-a-user)&p=1915406&viewfull=1#post1915406

masoud.rhb
سه شنبه 21 بهمن 1393, 09:14 صبح
سلام
منم یه روش به ذهنم میرسه،اینکه همه پوشه ها روی سرور از حالت شیر خارج بشن و یه نرم افزار از طرف خودمون روی سرور ران بشه که وظیفه واسط بین نرم افزار کاربران و سرور رو به عهده داره
به این ترتیب که نرم افزار کاربر به این نرم افزار که روی سرور در حال اجرا هست درخواست فایل میفرستن و این نرم افزار واسط چون روی سرور در حال اجرا هست و سطح دسترسی هم که طبیعتا داره،فایل رو میخونه و ارسال میکنه؛خوبهههههههههههههههه ههههههههههههههههههههههههه ههههههههههههههههههههههههه ه؟؟؟

FastCode
سه شنبه 21 بهمن 1393, 15:46 عصر
سلام
منم یه روش به ذهنم میرسه،اینکه همه پوشه ها روی سرور از حالت شیر خارج بشن و یه نرم افزار از طرف خودمون روی سرور ران بشه که وظیفه واسط بین نرم افزار کاربران و سرور رو به عهده داره
به این ترتیب که نرم افزار کاربر به این نرم افزار که روی سرور در حال اجرا هست درخواست فایل میفرستن و این نرم افزار واسط چون روی سرور در حال اجرا هست و سطح دسترسی هم که طبیعتا داره،فایل رو میخونه و ارسال میکنه؛خوبهههههههههههههههه ههههههههههههههههههههههههه ههههههههههههههههههههههههه ه؟؟؟
همه روشهای معرفی شده در این تاپیک همین کار رو میکنن...

masoud.rhb
شنبه 25 بهمن 1393, 07:29 صبح
همه روشهای معرفی شده در این تاپیک همین کار رو میکنن...
تو این روشا پوشه شیر میشه و شیر شدن پوشه حتی با یوزر و پسورد خطرناکه حسن؛ ولی وقتی برنامه خودت رو سرور ران باشه از نظر سطح دسترسی مشکلی نداره و پوشه هم شیر نمیشه کلا

FastCode
شنبه 25 بهمن 1393, 19:11 عصر
تو این روشا پوشه شیر میشه و شیر شدن پوشه حتی با یوزر و پسورد خطرناکه حسن؛ ولی وقتی برنامه خودت رو سرور ران باشه از نظر سطح دسترسی مشکلی نداره و پوشه هم شیر نمیشه کلا

همونطور که گفتم همه روشهای معرفی شده از یک برنامه واسط استفاده میکنند.
و هرگز فکر نکن میتونی یه چیزی امنتر از حتی ftp بنویسی. ftp با همه نا امن بودنش هزار و یک چیز رو در نظر میگیره.