Advantages of using the function directly in your program instead of calling rundll32.exe are meanful error codes and no external process needs to be called resulting in more control.
[DllImport("printui.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern void PrintUIEntryW(IntPtr hwnd, IntPtr hinst, string lpszCmdLine, int nCmdShow);
Get available commands in dialup box
PrintUIEntry(IntPtr.Zero, IntPtr.Zero, @"/?", 0);
Add per machine printer connection (the connection will be propagated to the user upon logon):
PrintUIEntry(IntPtr.Zero, IntPtr.Zero, @"/c \\machine /ga /n\\server\queue", 0);
Delete per machine printer connection (the connection will be deleted upon user logon):
PrintUIEntry(IntPtr.Zero, IntPtr.Zero, @"/c \\machine /gd /n\\server\queue", 0);
View default printer's properties
PrintDocument printDoc = new PrintDocument();
PrintUIEntryW(IntPtr.Zero, IntPtr.Zero, @"/p /n " + "\ printDoc.PrinterSettings.PrinterName "\, 0);
// "\"" required for printer name with spaces