PDA

View Full Version : سوال: چگونگی تشخیص Server IP Address



morteza271
سه شنبه 20 مهر 1389, 16:05 عصر
سلام دوستان...
چند تا سوال دارم برای یه برنامه که قراره تحت شبکه کار کنه و دیتابیس اونم sql server 2008 هست.

1- چجوری میشه IP کامپیوتر سرور رو مشخص کرد؟یعنی اگه بخوام برنامه بطور اتوماتیک IP کامپیوتر سرور رو بدست بیاره و ConnectionString رو بر اساس اون IP بسازه و به دیتابیس متصل بشه باید چیکار کنم؟اگه هم نمیشه چیکار کنم بهتره؟؟؟

2- من میخوام برای دیتابیسم یوزر و پسورد تعریف کنم و این کارو با استفاده از sql server managment از بخش Login انجام دادم ولی رو سیستم خودم(local) هم با یوزر پسورد و هم بدون اون یعنی حالت Integrated Security=true میشه به دیتابیس وصل شد!!!ولی من میخوام که فقط با یوزر و پسورد متصل بشه باید چیکار کنم؟؟؟

چون اولین برنامه ای هست که میخوام برای شبکه بنویسم اطلاعات زیادی در این زمینه ندارم و به همین دلیل از همه مهندسان خواهش میکنم هر گونه نکته ای که لازمه یا بهتره بدونم مخصوصا در مورد دیتابیس رو در همینجا قرار دهند تا بتونم استفاده کنم...
با تشکر فراوان از همه دوستان...

M.YasPro
سه شنبه 20 مهر 1389, 17:56 عصر
سلام
معمولا یه فایل application.Config که یک فایل Xml هست رو کنار پروژه میزارن و یه key توی اون برای connectionstring قرار میدن
مزیت این فایل اینه که تو سیستم مقصد توی مسیر نصب شده میتونید اونو با notepad ویرایش کنید .
نرم افزار های سطح بالاتر یه برنامه کوچیک برای اینکار درست میکنن که قابلیتهایی مثل جستجوی سرور و ست کردن user pass و ... انجام میده .

در مورد password هم باید instance ی که برای لاگین کردن انتخاب کردید و دیتابیس توی اون هست باید pass داشته باشه .
اینی که میگی به دو صورت می تونم وصل شم ، احتمالا دیتابیس رو تو دوتا instance داری . یعنی هم توی sql اونو داری و هم توی ویژوال استودیو

موفق باشید .

morteza271
سه شنبه 20 مهر 1389, 18:01 عصر
ممنونم دوست عزیز،ولی من میخوام یه جوری بفهمم IP سرور چیه؟!!!
یکی از دوستام بهم پیشنهاد کرد که یه قسمت بذارم که اگه IP سرور عوض شد خود کاربر اونو وارد کنه و منم اونو یه جا ذخیره کنم!!به نظرتون این مناسبه؟!

در ضمن من دیتابیسم فقط توی sql هست ولی با هردو روش وصل میشه!!!
همون دوستم میگه وقتی برنامه رو روی شبکه نصب کنم فقط با یوزر و پسورد متصل میشه،این درسته؟!
ممنونم

M.YasPro
سه شنبه 20 مهر 1389, 18:15 عصر
ممنونم دوست عزیز،ولی من میخوام یه جوری بفهمم IP سرور چیه؟!!!

IP آدرس منحصر به فرد یه کامپیوتر توی شبکه است مثلا IP میتونه 172.27.191.166 باشه برای اطلاعات بیشتر به اینجا (http://fa.wikipedia.org/wiki/IP)برید .



یکی از دوستام بهم پیشنهاد کرد که یه قسمت بذارم که اگه IP سرور عوض شد خود کاربر اونو وارد کنه و منم اونو یه جا ذخیره کنم!!به نظرتون این مناسبه؟!

خوبه اما این قسمت کجا هست ؟ توی برنامه هست ؟ بیرون برنامه هست ؟ روی فرم لاگین هست؟ فکر این رو کنید که اگر IP سرور شما عوض شد !! باید از فرم لاگین چه جوری عبور کرد در صورتی که فرم لاگین برای لاگین کردن اطلاعات رو باید از دیتابیس روی سرور بخونه ؟!!!


در ضمن من دیتابیسم فقط توی sql هست ولی با هردو روش وصل میشه!!!

حتما دوتا instance دارید . اینو برای اطمینان از تالار sql پیگیری کنید .



همون دوستم میگه وقتی برنامه رو روی شبکه نصب کنم فقط با یوزر و پسورد متصل میشه،این درسته؟!

نه ربطی به اون نداره . بستگی به instance سرور داره که autentication Mode مربوط به اون روی windows باشه یا sql server !!

موفق باشید .

morteza271
سه شنبه 20 مهر 1389, 18:28 عصر
IP
خوبه اما این قسمت کجا هست ؟ توی برنامه هست ؟ بیرون برنامه هست ؟ روی فرم لاگین هست؟ فکر این رو کنید که اگر IP سرور شما عوض شد !! باید از فرم لاگین چه جوری عبور کرد در صورتی که فرم لاگین برای لاگین کردن اطلاعات رو باید از دیتابیس روی سرور بخونه ؟!!!
موفق باشید .
ممنونم از توجه شما...
منظورم اینه که توی فرم لوگین بذارم مثلا یه کلید که با زدن اون یه فرم با یه تکست باکس باز بشه و بگیره،این خوبه به نظرت؟

این Instance که میگی رو باید از کجا بفهمم که دوتاست یا نه؟!!!میشه بیشتر توضیح بدین؟!
ممنونم

peymanjon
سه شنبه 20 مهر 1389, 18:34 عصر
شما از سیستم کلاینت نمی تونید IP سرور یا کلاینت های دیگر را از طریق کدنویسی بدست بیاورید مگه اینکه کامپیوتر سرور این اجازه را به شما بدهد ، یعنی اجازه لازم را در ویندوز سرور که در کامپیوتر سرور نصب است به شما به عنوان کلاینت داده بشه که IP سرور را داشته باشید .
معمولا IP های یک شبکه در یک range مشخص داده می شود و تغییرات زیادی در بازه های زمانی کوتاه در شماره های IP داده نمی شود ولی راهی که من به ذهنم می رسه این است که یا شما با بخش انفورماتیک جایی که می خواهید برنامه را برای آنجا بنویسید صحبت کنید و از مسئول شبکه آنها بپرسید این اجازه را به شما میدهند IP سرور را روی یک پورت خاص داشته باشید یا خیر ، اگر داشتید که آن را میتوانید در هنگامیکه برنامه run میشود بگیرید و set کنید در غیر این صورت باید یک APP کوچک بنویسید که در سرور run بشود و IP سرور را دریافت کند و در یک فیلد در دیتابیس ذخیره کند ، حال برنامه شما IP سرور را از از آن فیلد بخواند. چون تنها چیز مشترک بین شما و سرور ، دیتابیس است .برای نوشتن برنامه ای که IP یک سیستم را بدست بیاورد هم با یک سرچ کدهایش را بدست می آورید اگه نتونستید بگویید تا من بذارم چون من این کار را قبلا انجام دادم.
موفق باشید

M.YasPro
چهارشنبه 21 مهر 1389, 07:13 صبح
خوبه
ولی از نظر طراحی زیاد تو چشم نباشه چون شاید از هر 10000 بار لاگین یه بار استفاده بشه ، پس ذهن کاربر رو در گیر نکن .
Instance هات رو میتونی توی صفحه لاگین sqlsever توی کمبوی server name ببینید .
موفق باشید .

morteza271
چهارشنبه 21 مهر 1389, 10:45 صبح
برای نوشتن برنامه ای که IP یک سیستم را بدست بیاورد هم با یک سرچ کدهایش را بدست می آورید اگه نتونستید بگویید تا من بذارم چون من این کار را قبلا انجام دادم.
موفق باشید

ممنونم آقا پیمان...

اگه میشه لطف کن کدشم برام بذار ممنون میشم،آخه من همیشه اینترنت در دسترس ندارم و نمیتونم سرچ کنم!!!
راستی اگه اسم کامپیوتر سرور رو بخوام بازم با کد میشه پیداش کرد؟!
اگه میشه لطف کنید کد اینم بذارید...
واقعا ممنونم

peymanjon
چهارشنبه 21 مهر 1389, 17:37 عصر
بفرمائید این هم کد هایی که IP سیستم جاری را پیدا میکند.
http://www.codeproject.com/KB/IP/Net_Adapter_Info_in_C_.aspx
من از این کد تو پروژم استفاده کردم البته با کمی تغییر بصورت زیر :

string strip = string.Empty;
[DllImport("Iphlpapi.dll")]
public static extern uint GetAdaptersAddresses(uint Family, uint flags, IntPtr Reserved,
IntPtr PAdaptersAddresses, ref uint pOutBufLen);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]


public void x()
{
//////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////پیدا کردن IP/////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
IntPtr PAdaptersAddresses = new IntPtr();
bool AdapterFound = false;

uint pOutLen = 100;
PAdaptersAddresses = Marshal.AllocHGlobal(100);

uint ret =
GetAdaptersAddresses(0, 0, (IntPtr)0, PAdaptersAddresses, ref pOutLen);

// if 111 error, use
if (ret == 111)
{
Marshal.FreeHGlobal(PAdaptersAddresses);
PAdaptersAddresses = Marshal.AllocHGlobal((int)pOutLen);
ret = GetAdaptersAddresses(0, 0, (IntPtr)0, PAdaptersAddresses, ref pOutLen);
}

IP_Adapter_Addresses adds = new IP_Adapter_Addresses();

IntPtr pTemp = PAdaptersAddresses;
IntPtr pTempIP = new IntPtr();

while (pTemp != (IntPtr)0)
{
Marshal.PtrToStructure(pTemp, adds);
string adapterName = Marshal.PtrToStringAnsi(adds.AdapterName);
string FriendlyName = Marshal.PtrToStringAuto(adds.FriendlyName);
string tmpString = string.Empty;

for (int i = 0; i < 6; i++)
{
tmpString += string.Format("{0:X2}", adds.PhysicalAddress[i]);

if (i < 5)
{
tmpString += ":";
}
}


RegistryKey theLocalMachine = Registry.LocalMachine;

RegistryKey theSystem
= theLocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters \Interfaces");
RegistryKey theInterfaceKey = theSystem.OpenSubKey(adapterName);

if (theInterfaceKey != null)
{

string DhcpIPAddress = (string)theInterfaceKey.GetValue("DhcpIPAddress");

// system is using DHCP
if (DhcpIPAddress != null)
{
string tArray = (string)
theInterfaceKey.GetValue("DhcpIPAddress", theInterfaceKey);
if (FriendlyName.ToString() == "Wireless Network Connection")
{
strip += "Network adapter: " + FriendlyName.ToString() + "\r\n";
strip += "IP Address: " + tArray + "\r\n";
strip += "MAC Address: " + tmpString + "\r\n\r\n";
AdapterFound = true;



}


}

else
{
string[] tArray = (string[])
theInterfaceKey.GetValue("IPAddress", theInterfaceKey);

//AdapterInfoTextBox.Text += "Network adapter: " + FriendlyName.ToString() + "\r\n";

//for (int Interface = 0; Interface < tArray.Length; Interface++)
//{
// AdapterInfoTextBox.Text += "IP Address: " + tArray[Interface] + "\r\n";
// AdapterFound = true;
//}

//AdapterInfoTextBox.Text += "MAC Address: " + tmpString + "\r\n\r\n";
for (int Interface = 0; Interface < tArray.Length; Interface++)
{
strip = "\\" + "\\" + tArray[Interface];

AdapterFound = true;


}

}
}

pTemp = adds.Next;
}

if (AdapterFound != true)
{
strip += "No network adapters configured/present\r\n";

}

}


#endregion IP در صورت وجود در رشته strip قرار میگیره ، حالا شما می تونید بر اساس اون هر کاری می خوای بکنی.دوباره تاکید می کنم من کد را تغییر دادم تا اطلاعات اضافی را که به کارم نمی آمد حذف کنم برای همین آدرس منبع کد را برایتان گذاشتم تا شما از آن در صورتی که اطلاعات بیشتر می خواهید ، استفاده کنید.
حالا شما می توانید با نوشتن یک برنامه کوچک که شامل کد بالا می باشد در سرور IP آن را بدست آورید و آن را در دیتابیس ذخیره کنید ، حالا با برنامه اصلی خود در سمت کلاینت شما می توانید با متصل شدن به دیتابیس و IP سرور را داشته باشید.
در ضمن دیدن این برنامه ها هم خالی از لطف نیست:
http://www.codeproject.com/KB/IP/IpXconfig.aspx?display=Print
http://www.codeproject.com/KB/IP/obafindingipinformation.aspx
http://www.codeguru.com/Csharp/Csharp/cs_network/article.php/c6041
http://www.csharp-examples.net/local-ip/
امیدوارم کمک کرده باشم.
موفق باشید.

morteza271
شنبه 24 مهر 1389, 13:23 عصر
ممنونم ولی اگه تو دیتابیس ذخیره کنم چطوری میتونم به اون دسترسی داشته باشم در صورتی که من میخوام اون IP رو به کلاینت بدم تا به دستابیس روی سرور متصل بشه!!!!
ممنون...ولی دیگه لازمم نمیشه!!مرسی

peymanjon
شنبه 24 مهر 1389, 17:55 عصر
نکته همین جاست اگه برنامه شما قراره تحت شبکه اجرا بشه شما خواه نا خواه باید دیتابیست share باشه و دیگر کامپیوتر ها به او وصل باشند پس همانطور که گفتم شما ممکن است اجازه دسترسی به سرور را نداشته باشین تا بتوانید IP آن را بگیرید ولی هم شما و هم سرور در برنامه تحت شبکه به دیتابیس متصل هستید (در اصل دیتابیس در سرور است و client ها هم به آن متصل هستند)، یعنی در اصل نقطه اشتراک شما با سرور بانک اطلاعاتی شما است ، پس می توانید یک برنامه برای سرور بنویسید که به محض run شدن برنامه شما هم run شود IP سرور را در یک فیلد دیتابیس بریزد و شما از روی کامپیوتر خود که در شبکه می باشد و به دیتابیس نیز متصل هستید IP را بردارید و Connection خود را config کنید.
توجه کنید پورت 1433 برای دیتابیس SQL server میباشد که از طریق این پورت شما به دیتابیسی که در سرور است متصل میشوید ، و سرورها این پورت را برای برنامه های تحت شبکه شرکت و یا کارخانه باز می گذارند.
اگر اطلاعاتی در این زمینه ندارید به این آدرس بروید و pdf که گذاشتم را مطالعه کنید.http://barnamenevis.org/forum/showthread.php?t=249252
موفق باشید.