ServerUI.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.IO;
  7. using System.Net;
  8. using System.Net.NetworkInformation;
  9. using System.Net.Sockets;
  10. using System.Text;
  11. using System.Windows.Forms;
  12. using System.Xml;
  13. using SMBLibrary;
  14. using SMBLibrary.Server;
  15. using SMBLibrary.Server.Win32;
  16. using Utilities;
  17. namespace SMBServer
  18. {
  19. public partial class ServerUI : Form
  20. {
  21. public const string SettingsFileName = "Settings.xml";
  22. private SMBLibrary.Server.SMBServer m_server;
  23. private SMBLibrary.Server.NameServer m_nameServer;
  24. public ServerUI()
  25. {
  26. InitializeComponent();
  27. }
  28. private void ServerUI_Load(object sender, EventArgs e)
  29. {
  30. List<IPAddress> localIPs = NetworkInterfaceHelper.GetHostIPAddresses();
  31. KeyValuePairList<string, IPAddress> list = new KeyValuePairList<string, IPAddress>();
  32. list.Add("Any", IPAddress.Any);
  33. foreach (IPAddress address in localIPs)
  34. {
  35. list.Add(address.ToString(), address);
  36. }
  37. comboIPAddress.DataSource = list;
  38. comboIPAddress.DisplayMember = "Key";
  39. comboIPAddress.ValueMember = "Value";
  40. }
  41. private void btnStart_Click(object sender, EventArgs e)
  42. {
  43. IPAddress serverAddress = (IPAddress)comboIPAddress.SelectedValue;
  44. SMBTransportType transportType;
  45. if (rbtNetBiosOverTCP.Checked)
  46. {
  47. transportType = SMBTransportType.NetBiosOverTCP;
  48. }
  49. else
  50. {
  51. transportType = SMBTransportType.DirectTCPTransport;
  52. }
  53. INTLMAuthenticationProvider provider;
  54. if (chkIntegratedWindowsAuthentication.Checked)
  55. {
  56. provider = new Win32UserCollection();
  57. }
  58. else
  59. {
  60. UserCollection users;
  61. try
  62. {
  63. users = ReadUserSettings();
  64. }
  65. catch
  66. {
  67. MessageBox.Show("Cannot read " + SettingsFileName, "Error");
  68. return;
  69. }
  70. provider = new IndependentUserCollection(users);
  71. }
  72. List<string> allUsers = provider.ListUsers();
  73. ShareCollection shares;
  74. try
  75. {
  76. shares = ReadShareSettings(allUsers);
  77. }
  78. catch (Exception)
  79. {
  80. MessageBox.Show("Cannot read " + SettingsFileName, "Error");
  81. return;
  82. }
  83. m_server = new SMBLibrary.Server.SMBServer(shares, provider, serverAddress, transportType, chkSMB1.Checked, chkSMB2.Checked);
  84. m_server.OnLogEntry += new EventHandler<LogEntry>(Server_OnLogEntry);
  85. try
  86. {
  87. m_server.Start();
  88. if (transportType == SMBTransportType.NetBiosOverTCP)
  89. {
  90. if (serverAddress.AddressFamily == AddressFamily.InterNetwork && !IPAddress.Equals(serverAddress, IPAddress.Any))
  91. {
  92. IPAddress subnetMask = NetworkInterfaceHelper.GetSubnetMask(serverAddress);
  93. m_nameServer = new NameServer(serverAddress, subnetMask);
  94. m_nameServer.Start();
  95. }
  96. }
  97. }
  98. catch (Exception ex)
  99. {
  100. MessageBox.Show(ex.Message, "Error");
  101. return;
  102. }
  103. btnStart.Enabled = false;
  104. btnStop.Enabled = true;
  105. comboIPAddress.Enabled = false;
  106. rbtDirectTCPTransport.Enabled = false;
  107. rbtNetBiosOverTCP.Enabled = false;
  108. chkSMB1.Enabled = false;
  109. chkSMB2.Enabled = false;
  110. chkIntegratedWindowsAuthentication.Enabled = false;
  111. }
  112. private XmlDocument GetSettingsXML()
  113. {
  114. string executableDirectory = Path.GetDirectoryName(Application.ExecutablePath) + "\\";
  115. XmlDocument document = GetXmlDocument(executableDirectory + SettingsFileName);
  116. return document;
  117. }
  118. private UserCollection ReadUserSettings()
  119. {
  120. UserCollection users = new UserCollection();
  121. XmlDocument document = GetSettingsXML();
  122. XmlNode usersNode = document.SelectSingleNode("Settings/Users");
  123. foreach (XmlNode userNode in usersNode.ChildNodes)
  124. {
  125. string accountName = userNode.Attributes["AccountName"].Value;
  126. string password = userNode.Attributes["Password"].Value;
  127. users.Add(accountName, password);
  128. }
  129. return users;
  130. }
  131. private ShareCollection ReadShareSettings(List<string> allUsers)
  132. {
  133. ShareCollection shares = new ShareCollection();
  134. XmlDocument document = GetSettingsXML();
  135. XmlNode sharesNode = document.SelectSingleNode("Settings/Shares");
  136. foreach (XmlNode shareNode in sharesNode.ChildNodes)
  137. {
  138. string shareName = shareNode.Attributes["Name"].Value;
  139. string sharePath = shareNode.Attributes["Path"].Value;
  140. XmlNode readAccessNode = shareNode.SelectSingleNode("ReadAccess");
  141. List<string> readAccess = ReadAccessList(readAccessNode, allUsers);
  142. XmlNode writeAccessNode = shareNode.SelectSingleNode("WriteAccess");
  143. List<string> writeAccess = ReadAccessList(writeAccessNode, allUsers);
  144. shares.Add(shareName, readAccess, writeAccess, new DirectoryFileSystem(sharePath));
  145. }
  146. return shares;
  147. }
  148. private List<string> ReadAccessList(XmlNode node, List<string> allUsers)
  149. {
  150. List<string> result = new List<string>();
  151. if (node != null)
  152. {
  153. string accounts = node.Attributes["Accounts"].Value;
  154. if (accounts == "*")
  155. {
  156. result.AddRange(allUsers);
  157. }
  158. else
  159. {
  160. string[] splitted = accounts.Split(',');
  161. result.AddRange(splitted);
  162. }
  163. }
  164. return result;
  165. }
  166. private void btnStop_Click(object sender, EventArgs e)
  167. {
  168. m_server.Stop();
  169. btnStart.Enabled = true;
  170. btnStop.Enabled = false;
  171. comboIPAddress.Enabled = true;
  172. rbtDirectTCPTransport.Enabled = true;
  173. rbtNetBiosOverTCP.Enabled = true;
  174. chkSMB1.Enabled = true;
  175. chkSMB2.Enabled = true;
  176. chkIntegratedWindowsAuthentication.Enabled = true;
  177. if (m_nameServer != null)
  178. {
  179. m_nameServer.Stop();
  180. }
  181. }
  182. private static XmlDocument GetXmlDocument(string path)
  183. {
  184. XmlDocument doc = new XmlDocument();
  185. doc.Load(path);
  186. return doc;
  187. }
  188. private void Server_OnLogEntry(object sender, LogEntry entry)
  189. {
  190. string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ");
  191. string message = String.Format("{0} {1} {2}", entry.Severity.ToString().PadRight(12), timestamp, entry.Message);
  192. System.Diagnostics.Debug.Print(message);
  193. }
  194. private void chkSMB1_CheckedChanged(object sender, EventArgs e)
  195. {
  196. if (!chkSMB1.Checked)
  197. {
  198. chkSMB2.Checked = true;
  199. }
  200. }
  201. private void chkSMB2_CheckedChanged(object sender, EventArgs e)
  202. {
  203. if (!chkSMB2.Checked)
  204. {
  205. chkSMB1.Checked = true;
  206. }
  207. }
  208. }
  209. }