I have an IIS7 web server that runs loads of sites each with multiple bindings. Each site uses host headers AND their own IP.
Using C# I need to change the IP on all bindings to 0.0.0.0 so they listen on all the IPs.
My current code doesn't add the new bindings but clears the old ones. Any ides what I'm doing wrong?
My Code:
using (ServerManager iisServerManager = new ServerManager())
{
foreach (Site site in iisServerManager.Sites)
{
List<Microsoft.Web.Administration.Binding> bindings = new List<Microsoft.Web.Administration.Binding>();
foreach (Microsoft.Web.Administration.Binding binding in site.Bindings)
{
String protocol = binding.Protocol;
String hostHeader = binding.Host;
String ipAddress = "0.0.0.0";
Int32 port = binding.EndPoint.Port;
String bind = ipAddress + ":" + port + ":" + hostHeader;
binding.BindingInformation = bind;
bindings.Add(binding);
}
//Clear existing site bindings
site.Bindings.Clear();
Int32 bindingCount = site.Bindings.Count();
foreach (Microsoft.Web.Administration.Binding binding in bindings)
{
site.Bindings.Add(binding);
bindingCount = site.Bindings.Count();
}
bindingCount = site.Bindings.Count();
iisServerManager.CommitChanges();
}
}
You don't need to remove and then re-add the same bindings. You can just modify them in place and then commit your changes. Also, you want to use the ip address of '*' instead of '0.0.0.0' when you want to listen on all ip addresses.
This worked for me...
using (ServerManager iisServerManager = new ServerManager())
{
foreach (Site site in iisServerManager.Sites)
{
foreach (Binding binding in site.Bindings)
{
string ipAddress = "*";
int port = binding.EndPoint.Port;
string hostHeader = binding.Host;
binding.BindingInformation = string.Format("{0}:{1}:{2}", ipAddress, port, hostHeader);
}
iisServerManager.CommitChanges();
}
}
Related
On my web application I am using the following function to get System IP
Function
public void SetHostid()
{
try
{
string ip = "";
string strHostName = "";
strHostName = System.Net.Dns.GetHostName();
IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
ip = addr[1].MapToIPv4().ToString();
HostId = ip;
HttpContext.Current.Session["Hostid"] = HostId;
}
catch (Exception ex)
{
Error_ManagerClass em = new Error_ManagerClass();
em.WriteError(ex);
}
}
It works perfectly because the IP is on the 1 postion of the variable addr (addr[ 1]).
And the problem comes when I try to run the same solution from a different system. function throws an error while trynig to convert IP to string( ip = addr[1].MapToIPv4().ToString(); ) because IP is not in the position number 1.
how can I change the function to work on every computer ??
If you want to get IPv4 only use this code:
var addr = ipEntry.AddressList.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork);
var firstInList = addr.First(); // get first
But you should consider which IP to chose when there are several IP addresses in system.
I am creating a C# winform application, in which I want to change the Public IP Address, NOT the IPv4 Address like (Hotspot-Shield, ZenMate, OpenVPN, and others do).
I have checked the following links but didn't find enough help, so I am posting this question:
How can you change Network settings (IP Address, DNS, WINS, Host Name) with code in C#
Changing IP address in C#
I write the same code as in the answer of 1st link and also used the libraries but when I check my IP address through google.com it remains the same. I don't know the socket programming.
Here is my code:
namespace WindowsFormsApplication1
{
class ChangeIP
{
public void SetIP(string ipAddress, string subnetMask, string gateway)
{
using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration"))
{
using (var networkConfigs = networkConfigMng.GetInstances())
{
foreach (var managementObject in networkConfigs.Cast<ManagementObject>().Where(managementObject => (bool)managementObject["IPEnabled"]))
{
using (var newIP = managementObject.GetMethodParameters("EnableStatic"))
{
// Set new IP address and subnet if needed
if ((!String.IsNullOrEmpty(ipAddress)) || (!String.IsNullOrEmpty(subnetMask)))
{
if (!String.IsNullOrEmpty(ipAddress))
{
newIP["IPAddress"] = new[] { ipAddress };
}
if (!String.IsNullOrEmpty(subnetMask))
{
newIP["SubnetMask"] = new[] { subnetMask };
}
managementObject.InvokeMethod("EnableStatic", newIP, null);
}
// Set mew gateway if needed
if (!String.IsNullOrEmpty(gateway))
{
using (var newGateway = managementObject.GetMethodParameters("SetGateways"))
{
newGateway["DefaultIPGateway"] = new[] { gateway };
newGateway["GatewayCostMetric"] = new[] { 1 };
managementObject.InvokeMethod("SetGateways", newGateway, null);
}
}
}
}
}
}
}
/// <summary>
/// Set's the DNS Server of the local machine
/// </summary>
/// <param name="nic">NIC address</param>
/// <param name="dnsServers">Comma seperated list of DNS server addresses</param>
/// <remarks>Requires a reference to the System.Management namespace</remarks>
public void SetNameservers(string nic, string dnsServers)
{
using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration"))
{
using (var networkConfigs = networkConfigMng.GetInstances())
{
foreach (var managementObject in networkConfigs.Cast<ManagementObject>().Where(objMO => (bool)objMO["IPEnabled"] && objMO["Caption"].Equals(nic)))
{
using (var newDNS = managementObject.GetMethodParameters("SetDNSServerSearchOrder"))
{
newDNS["DNSServerSearchOrder"] = dnsServers.Split(',');
managementObject.InvokeMethod("SetDNSServerSearchOrder", newDNS, null);
}
}
}
}
}
}
}
And Here is how I am calling those methods:
{
static string local_ip;
string public_ip;
public static string GetLocalIPAddress() //Method For Getting Local Machine IP
{
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
return ip.ToString();
}
}
throw new Exception("Local IP Address Not Found!");
}
// Mehod End
local_ip = GetLocalIPAddress();
ChangeIP ip = new ChangeIP();
ip.SetIP(local_ip, null, null); // Calling Method
var getNIC = NetworkInterface.GetAllNetworkInterfaces();
NetworkInterface[] NI = NetworkInterface.GetAllNetworkInterfaces();
string nic = string.Empty;
string dnsServer = string.Empty;
foreach(var r in getNIC)
{
nic = r.Name;
}
foreach(NetworkInterface ninter in NI)
{
if(ninter.OperationalStatus == OperationalStatus.Up)
{
IPInterfaceProperties ipProperties = ninter.GetIPProperties();
IPAddressCollection dnsAddresses = ipProperties.DnsAddresses;
foreach(IPAddress dnsAdrs in dnsAddresses)
{
dnsServer = dnsAdrs.ToString();
}
}
}
ip.SetNameservers(nic, dnsServer); // Calling Method
public_ip = new WebClient().DownloadString("http://icanhazip.com");
}
How you've described your question is not how the internet (is supposed to) work(s).
Windows doesn't let you write raw IP packets, for this you need to use a TAP/TUN driver. But although you send out packets spoofing the source IP address, the internet between you and the destination won't return the route.
If you're operating behind a block of IP addresses, and only want to spoof another in that block, the return address will get back to your local router, but still won't necessary route back to you.
Unless you use TAP/TUN, there's no other way to steal someone else's Public IP address, excluding other network security vulnerability exploitations which are beyond the scope of this forum.
And even with TAP/TUN you're very limited in what you can achieve over spoofed IP packets in one direction. In fact, ISPs may filter out spoofed IP addresses.
I have created wifi scanner in .net c# window application. Right now i'm able to connect to WPA2-Personal authentication network.Now i want to connect with WPA-Enterprise Network but i'm not getting any idea how to connect to it.
Please if you have any solution so let me know
Below is my code for WPA2-Personal which is working
WlanClient client = new WlanClient();
foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
{
Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);
foreach (Wlan.WlanAvailableNetwork network in networks)
{
Wlan.Dot11Ssid ssid = network.dot11Ssid;
string networkName = Encoding.ASCII.GetString(ssid.SSID, 0, (int)ssid.SSIDLength);
ListViewItem item = new ListViewItem(networkName);
item.SubItems.Add(network.dot11DefaultCipherAlgorithm.ToString());
item.SubItems.Add(network.wlanSignalQuality + "%");
item.SubItems.Add(network.dot11DefaultAuthAlgorithm.ToString());
listView1.Items.Add(item);
}
string profileName = "Network"; // this is also the SSID
string macA = "MAC_ADDRESS";
string key = "PASSWORD";
string profileXml = string.Format("<?xml version=\"1.0\" encoding=\"US-ASCII\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><connectionMode>auto</connectionMode><autoSwitch>false</autoSwitch><MSM><security><authEncryption><authentication>WPAPSK</authentication><encryption>TKIP</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>passPhrase</keyType><protected>false</protected><keyMaterial>{1}</keyMaterial></sharedKey></security></MSM></WLANProfile>", profileName, key); //WPA-PSK
wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true);
wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName);
}
I found this C# code for simple IP net scanner which scans the connected hosts in the network and displays its physical address and IP address.It works well but only when connected with the network via WIFI. It doesn't work when connected through the network via wires.
[DllImport("iphlpapi.dll", ExactSpelling = true)]
At first, iphlpapi.dll has been imported. So, can you explain it? the rest of the code is given below.
// Use Your work Group WinNT://&&&&(Work Group Name)
DirectoryEntry DomainEntry = new DirectoryEntry("WinNT://" + this.TxtWorkGroup.Text.Trim());
DomainEntry.Children.SchemaFilter.Add("computer");
// To Get all the System names And Display with the Ip Address
foreach (DirectoryEntry machine in DomainEntry.Children)
{
string[] Ipaddr = new string[3];
Ipaddr[0] = machine.Name;
System.Net.IPHostEntry Tempaddr = null;
try
{
Tempaddr = (System.Net.IPHostEntry)Dns.GetHostByName(machine.Name);
}
catch (Exception)
{
MessageBox.Show("Unable to connect with the system :" + machine.Name);
continue;
}
IPAddress[] TempAd = Tempaddr.AddressList;
foreach (IPAddress TempA in TempAd)
{
Ipaddr[1] = TempA.ToString();
byte[] ab = new byte[6];
int len = ab.Length;
// This Function Used to Get The Physical Address
int r = SendARP((int)TempA.Address, 0, ab, ref len);
string mac = BitConverter.ToString(ab, 0, 6);
Ipaddr[2] = mac;
}
ListViewItem TempItem = new ListViewItem(Ipaddr);
this.ListHostIP.Items.Add(TempItem);
}
}
Turn off the WIFI adapter and try it again.
I'd like to know how to get the IP of the user connected to my application ( asp.net mvc4) .
I tried:
IPHostEntry ipHostEntry = Dns.GetHostByName(Dns.GetHostName());
IPAddress ipAddress = ipHostEntry.AddressList[0];
But it didn't work.
So how can I modify the snippet to get the Ip` or the connected user?
Here's the converted C# code from the similar question #jamieHennerley suggested.
protected string GetIPAddress()
{
System.Web.HttpContext context = System.Web.HttpContext.Current;
string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipAddress))
{
string[] addresses = ipAddress.Split(',');
if (addresses.Length != 0)
{
return addresses[0];
}
}
return context.Request.ServerVariables["REMOTE_ADDR"];
}