Well I don't know about the ip and mac but you can get the machine name using System.Environment.MachineName.
The other networking data is probably available through some other class, although I couldn't tell you what it is off the top of my head.
Yes, it's pretty straightforward.
You can create headers either by using a MessageContract. (See this link for further details)
or by getting the OperationContext and putting it in manually:
ChannelFactory<IScott> CFScott = new ChannelFactory<IScott>(binding);
IScott proxy = CFScott.CreateChannel(endptadr);MessageHeader<string> msgh= new MessageHeader<string> ( Environment.UserDomainName + "\\" + Environment.UserName,false,"urn:ScottsServer",true);
msghun = msgh.GetUntypedHeader("Username", "urn:ScottsReallyCoolApp");
OperationContextScopescope = new OperationContextScope((IContextChannel)proxy); OperationContext.Current.OutgoingMessageHeaders.Add(msghun);
stringusername = oc.IncomingMessageHeaders.GetHeader<string>("Username", "urn:ScottsReallyCoolApp","urn:ScottsServer");