Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

NamedPipeServerStream.GetImpersonationUserName Method

Definition

Namespace:
System.IO.Pipes
Assemblies:
netstandard.dll, System.IO.Pipes.dll
Assembly:
System.IO.Pipes.dll
Assembly:
System.Core.dll
Assembly:
netstandard.dll
Source:
NamedPipeServerStream.Unix.cs
Source:
NamedPipeServerStream.Unix.cs
Source:
NamedPipeServerStream.Unix.cs
Source:
NamedPipeServerStream.Unix.cs
Source:
NamedPipeServerStream.Unix.cs

Important

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

Gets the user name of the client on the other end of the pipe.

public:
 System::String ^ GetImpersonationUserName();
public string GetImpersonationUserName();
[System.Security.SecurityCritical]
public string GetImpersonationUserName();
member this.GetImpersonationUserName : unit -> string
[<System.Security.SecurityCritical>]
member this.GetImpersonationUserName : unit -> string
Public Function GetImpersonationUserName () As String

Returns

The user name of the client on the other end of the pipe.

Attributes

Exceptions

No pipe connections have been made yet.

-or-

The connected pipe has already disconnected.

-or-

The pipe handle has not been set.

The pipe is closed.

The pipe connection has been broken.

-or-

The user name of the client is longer than 19 characters.

Examples

The following example demonstrates a method to create a pipe server that can respond to multiple simultaneous client requests, and a method for client impersonation. This example creates a NamedPipeServerStream object in a parent process, which then creates multiple threads that wait for NamedPipeClientStream objects to connect. After a client is connected, it supplies a file name to the server and the contents of that file are read and sent back to the client. Because the NamedPipeServerStream impersonates the client when opening the file, the client can request only files that it has sufficient permissions to open.

using System;
using System.IO;
using System.IO.Pipes;
using System.Text;
using System.Threading;

public class PipeServer
{
 private static int numThreads = 4;

 public static void Main()
 {
 int i;
 Thread[] servers = new Thread[numThreads];

 Console.WriteLine("\n*** Named pipe server stream with impersonation example ***\n");
 Console.WriteLine("Waiting for client connect...\n");
 for (i = 0; i < numThreads; i++)
 {
 servers[i] = new Thread(ServerThread);
 servers[i].Start();
 }
 Thread.Sleep(250);
 while (i > 0)
 {
 for (int j = 0; j < numThreads; j++)
 {
 if (servers[j] != null)
 {
 if (servers[j].Join(250))
 {
 Console.WriteLine("Server thread[{0}] finished.", servers[j].ManagedThreadId);
 servers[j] = null;
 i--; // decrement the thread watch count
 }
 }
 }
 }
 Console.WriteLine("\nServer threads exhausted, exiting.");
 }

 private static void ServerThread(object data)
 {
 NamedPipeServerStream pipeServer =
 new NamedPipeServerStream("testpipe", PipeDirection.InOut, numThreads);

 int threadId = Thread.CurrentThread.ManagedThreadId;

 // Wait for a client to connect
 pipeServer.WaitForConnection();

 Console.WriteLine("Client connected on thread[{0}].", threadId);
 try
 {
 // Read the request from the client. Once the client has
 // written to the pipe its security token will be available.

 StreamString ss = new StreamString(pipeServer);

 // Verify our identity to the connected client using a
 // string that the client anticipates.

 ss.WriteString("I am the one true server!");
 string filename = ss.ReadString();

 // Read in the contents of the file while impersonating the client.
 ReadFileToStream fileReader = new ReadFileToStream(ss, filename);

 // Display the name of the user we are impersonating.
 Console.WriteLine("Reading file: {0} on thread[{1}] as user: {2}.",
 filename, threadId, pipeServer.GetImpersonationUserName());
 pipeServer.RunAsClient(fileReader.Start);
 }
 // Catch the IOException that is raised if the pipe is broken
 // or disconnected.
 catch (IOException e)
 {
 Console.WriteLine("ERROR: {0}", e.Message);
 }
 pipeServer.Close();
 }
}

// Defines the data protocol for reading and writing strings on our stream
public class StreamString
{
 private Stream ioStream;
 private UnicodeEncoding streamEncoding;

 public StreamString(Stream ioStream)
 {
 this.ioStream = ioStream;
 streamEncoding = new UnicodeEncoding();
 }

 public string ReadString()
 {
 int len = 0;

 len = ioStream.ReadByte() * 256;
 len += ioStream.ReadByte();
 byte[] inBuffer = new byte[len];
 ioStream.Read(inBuffer, 0, len);

 return streamEncoding.GetString(inBuffer);
 }

 public int WriteString(string outString)
 {
 byte[] outBuffer = streamEncoding.GetBytes(outString);
 int len = outBuffer.Length;
 if (len > UInt16.MaxValue)
 {
 len = (int)UInt16.MaxValue;
 }
 ioStream.WriteByte((byte)(len / 256));
 ioStream.WriteByte((byte)(len & 255));
 ioStream.Write(outBuffer, 0, len);
 ioStream.Flush();

 return outBuffer.Length + 2;
 }
}

// Contains the method executed in the context of the impersonated user
public class ReadFileToStream
{
 private string fn;
 private StreamString ss;

 public ReadFileToStream(StreamString str, string filename)
 {
 fn = filename;
 ss = str;
 }

 public void Start()
 {
 string contents = File.ReadAllText(fn);
 ss.WriteString(contents);
 }
}
Imports System.IO
Imports System.IO.Pipes
Imports System.Text
Imports System.Threading

Public Class PipeServer
 Private Shared numThreads As Integer = 4

 Public Shared Sub Main()
 Dim i As Integer
 Dim servers(numThreads) As Thread

 Console.WriteLine(Environment.NewLine + "*** Named pipe server stream with impersonation example ***" + Environment.NewLine)
 Console.WriteLine("Waiting for client connect..." + Environment.NewLine)
 For i = 0 To numThreads - 1
 servers(i) = New Thread(AddressOf ServerThread)
 servers(i).Start()
 Next i
 Thread.Sleep(250)
 While i > 0
 For j As Integer = 0 To numThreads - 1
 If Not(servers(j) Is Nothing) Then
 if servers(j).Join(250)
 Console.WriteLine("Server thread[{0}] finished.", servers(j).ManagedThreadId)
 servers(j) = Nothing
 i -= 1 ' decrement the thread watch count
 End If
 End If
 Next j
 End While
 Console.WriteLine(Environment.NewLine + "Server threads exhausted, exiting.")
 End Sub

 Private Shared Sub ServerThread(data As Object)
 Dim pipeServer As New _
 NamedPipeServerStream("testpipe", PipeDirection.InOut, numThreads)

 Dim threadId As Integer = Thread.CurrentThread.ManagedThreadId

 ' Wait for a client to connect
 pipeServer.WaitForConnection()

 Console.WriteLine("Client connected on thread[{0}].", threadId)
 Try
 ' Read the request from the client. Once the client has
 ' written to the pipe its security token will be available.

 Dim ss As new StreamString(pipeServer)

 ' Verify our identity to the connected client using a
 ' string that the client anticipates.

 ss.WriteString("I am the one true server!")
 Dim filename As String = ss.ReadString()

 ' Read in the contents of the file while impersonating the client.
 Dim fileReader As New ReadFileToStream(ss, filename)

 ' Display the name of the user we are impersonating.
 Console.WriteLine("Reading file: {0} on thread[{1}] as user: {2}.",
 filename, threadId, pipeServer.GetImpersonationUserName())
 pipeServer.RunAsClient(AddressOf fileReader.Start)
 ' Catch the IOException that is raised if the pipe is broken
 ' or disconnected.
 Catch e As IOException
 Console.WriteLine("ERROR: {0}", e.Message)
 End Try
 pipeServer.Close()
 End Sub
End Class

' Defines the data protocol for reading and writing strings on our stream
Public Class StreamString
 Private ioStream As Stream
 Private streamEncoding As UnicodeEncoding

 Public Sub New(ioStream As Stream)
 Me.ioStream = ioStream
 streamEncoding = New UnicodeEncoding(False, False)
 End Sub

 Public Function ReadString() As String
 Dim len As Integer = 0
 len = CType(ioStream.ReadByte(), Integer) * 256
 len += CType(ioStream.ReadByte(), Integer)
 Dim inBuffer As Array = Array.CreateInstance(GetType(Byte), len)
 ioStream.Read(inBuffer, 0, len)

 Return streamEncoding.GetString(inBuffer)
 End Function

 Public Function WriteString(outString As String) As Integer
 Dim outBuffer() As Byte = streamEncoding.GetBytes(outString)
 Dim len As Integer = outBuffer.Length
 If len > UInt16.MaxValue Then
 len = CType(UInt16.MaxValue, Integer)
 End If
 ioStream.WriteByte(CType(len \ 256, Byte))
 ioStream.WriteByte(CType(len And 255, Byte))
 ioStream.Write(outBuffer, 0, outBuffer.Length)
 ioStream.Flush()

 Return outBuffer.Length + 2
 End Function
End Class

' Contains the method executed in the context of the impersonated user
Public Class ReadFileToStream
 Private fn As String
 Private ss As StreamString

 Public Sub New(str As StreamString, filename As String)
 fn = filename
 ss = str
 End Sub

 Public Sub Start()
 Dim contents As String = File.ReadAllText(fn)
 ss.WriteString(contents)
 End Sub
End Class

Remarks

The GetImpersonationUserName method returns null if the client has not yet written to the pipe or if the connected client did not connect with a TokenImpersonationLevel of Impersonation.

Applies to


Feedback

Was this page helpful?