home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / dcom / dcomperm / dcomperm.cpp < prev    next >
C/C++ Source or Header  |  1997-04-07  |  13KB  |  400 lines

  1. /*++
  2.  
  3. DCOM Permission Configuration Sample
  4. Copyright (c) 1996, Microsoft Corporation. All rights reserved.
  5.  
  6. Module Name:
  7.  
  8.     dcomperm.cpp
  9.  
  10. Abstract:
  11.  
  12.     Main module for DCOM Permission Configuration Sample
  13.  
  14. Author:
  15.  
  16.     Michael Nelson
  17.  
  18. Environment:
  19.  
  20.     Windows NT
  21.  
  22. --*/
  23.  
  24. #include <windows.h>
  25. #include <stdio.h>
  26. #include <conio.h>
  27. #include <tchar.h>
  28. #include "ntsecapi.h"
  29. #include "dcomperm.h"
  30.  
  31. void
  32. ShowUsage (
  33.     LPTSTR ErrorString
  34.     )
  35. {
  36.     _tprintf (TEXT("%s\n"), ErrorString);
  37.     _tprintf (TEXT("Syntax: dcomperm <option> [...]\n\n"));
  38.  
  39.     _tprintf (TEXT("Options:\n"));
  40.  
  41.     _tprintf (TEXT("   -da <\"set\" or \"remove\"> <Principal Name> [\"permit\" or \"deny\"]\n"));
  42.     _tprintf (TEXT("   -da list\n"));
  43.     _tprintf (TEXT("       Modify or list the default access permission list\n\n"));
  44.  
  45.     _tprintf (TEXT("   -dl <\"set\" or \"remove\"> <Principal Name> [\"permit\" or \"deny\"]\n"));
  46.     _tprintf (TEXT("   -dl list\n"));
  47.     _tprintf (TEXT("       Modify or list the default launch permission list\n\n"));
  48.  
  49.     _tprintf (TEXT("   -aa <AppID> <\"set\" or \"remove\"> <Principal Name> [\"permit\" or \"deny\"]\n"));
  50.     _tprintf (TEXT("   -aa <AppID> default\n"));
  51.     _tprintf (TEXT("   -aa <AppID> list\n"));
  52.     _tprintf (TEXT("       Modify or list the access permission list for a specific AppID\n\n"));
  53.  
  54.     _tprintf (TEXT("   -al <AppID> <\"set\" or \"remove\"> <Principal Name> [\"permit\" or \"deny\"]\n"));
  55.     _tprintf (TEXT("   -al <AppID> default\n"));
  56.     _tprintf (TEXT("   -al <AppID> list\n"));
  57.     _tprintf (TEXT("       Modify or list the launch permission list for a specific AppID\n\n"));
  58.  
  59.     _tprintf (TEXT("Press any key to continue. . ."));
  60.     _getch();
  61.     _tprintf (TEXT("\r                               \r"));
  62.  
  63.     _tprintf (TEXT("   -runas <AppID> <Principal Name> <Password>\n"));
  64.     _tprintf (TEXT("   -runas <AppID> \"Interactive User\"\n"));
  65.     _tprintf (TEXT("       Set the RunAs information for a specific AppID\n\n"));
  66.  
  67.     _tprintf (TEXT("Examples:\n"));
  68.     _tprintf (TEXT("   dcomperm -da set redmond\\t-miken permit\n"));
  69.     _tprintf (TEXT("   dcomperm -dl set redmond\\jdoe deny\n"));
  70.     _tprintf (TEXT("   dcomperm -aa {12345678-1234-1234-1234-00aa00bbf7c7} list\n"));
  71.     _tprintf (TEXT("   dcomperm -al {12345678-1234-1234-1234-00aa00bbf7c7} remove redmond\\t-miken\n"));
  72.     _tprintf (TEXT("   dcomperm -runas {12345678-1234-1234-1234-00aa00bbf7c7} redmond\\jdoe password\n"));
  73.  
  74.     exit (0);
  75. }
  76.  
  77. void
  78. Error (
  79.     LPTSTR ErrorMessage,
  80.     DWORD ErrorCode
  81.     )
  82. {
  83.     TCHAR messageBuffer [255];
  84.  
  85.     _tprintf (TEXT("%s\n%s"), ErrorMessage, SystemMessage (messageBuffer, ErrorCode));
  86.     exit (0);
  87. }
  88.  
  89. void
  90. HandleDAOption (
  91.     int argc,
  92.     TCHAR **argv
  93.     )
  94. {
  95.     DWORD returnValue;
  96.  
  97.     if (argc < 3)
  98.         ShowUsage (TEXT("Invalid number of arguments."));
  99.  
  100.     if (_tcscmp (_tcsupr (argv [2]), TEXT("LIST")) == 0)
  101.     {
  102.         _tprintf (TEXT("Default access permission list:\n\n"));
  103.         ListDefaultAccessACL();
  104.         return;
  105.     }
  106.  
  107.     if (argc < 4)
  108.         ShowUsage (TEXT("Invalid number of arguments."));
  109.  
  110.     if (_tcscmp (_tcsupr (argv [2]), TEXT("SET")) == 0)
  111.     {
  112.         if (argc < 5)
  113.             ShowUsage (TEXT("Invalid number of arguments."));
  114.  
  115.         if (_tcscmp (_tcsupr (argv [4]), TEXT("PERMIT")) == 0)
  116.             returnValue = ChangeDefaultAccessACL (argv [3], TRUE, TRUE); else
  117.  
  118.         if (_tcscmp (_tcsupr (argv [4]), TEXT("DENY")) == 0)
  119.             returnValue = ChangeDefaultAccessACL (argv [3], TRUE, FALSE); else
  120.         {
  121.             ShowUsage (TEXT("You can only set a user's permissions to \"permit\" or \"deny\".\n\n"));
  122.         }
  123.  
  124.         if (returnValue != ERROR_SUCCESS)
  125.             Error (TEXT("ERROR: Cannot add user to default access ACL."), returnValue);
  126.     } else
  127.     if (_tcscmp (_tcsupr (argv [2]), TEXT("REMOVE")) == 0)
  128.     {
  129.         returnValue = ChangeDefaultAccessACL (argv[3], FALSE, FALSE);
  130.  
  131.         if (returnValue != ERROR_SUCCESS)
  132.             Error (TEXT("ERROR: Cannot remove user from default access ACL."), returnValue);
  133.     } else
  134.         ShowUsage (TEXT("You can only \"set\" or \"remove\" a user."));
  135. }
  136.  
  137. void
  138. HandleDLOption (
  139.     int argc,
  140.     TCHAR **argv
  141.     )
  142. {
  143.     DWORD returnValue;
  144.  
  145.     if (argc < 3)
  146.         ShowUsage (TEXT("Invalid number of arguments."));
  147.  
  148.     if (_tcscmp (_tcsupr (argv [2]), TEXT("LIST")) == 0)
  149.     {
  150.         _tprintf (TEXT("Default launch permission list:\n\n"));
  151.         ListDefaultLaunchACL();
  152.         return;
  153.     }
  154.  
  155.     if (argc < 4)
  156.         ShowUsage (TEXT("Invalid number of arguments."));
  157.  
  158.     if (_tcscmp (_tcsupr (argv [2]), TEXT("SET")) == 0)
  159.     {
  160.         if (argc < 5)
  161.             ShowUsage (TEXT("Invalid number of arguments."));
  162.  
  163.         if (_tcscmp (_tcsupr (argv [4]), TEXT("PERMIT")) == 0)
  164.             returnValue = ChangeDefaultLaunchACL (argv [3], TRUE, TRUE); else
  165.  
  166.         if (_tcscmp (_tcsupr (argv [4]), TEXT("DENY")) == 0)
  167.             returnValue = ChangeDefaultLaunchACL (argv [3], TRUE, FALSE); else
  168.         {
  169.             ShowUsage (TEXT("You can only set a user's permissions to \"permit\" or \"deny\".\n\n"));
  170.         }
  171.  
  172.         if (returnValue != ERROR_SUCCESS)
  173.             Error (TEXT("ERROR: Cannot add user to default launch ACL."), returnValue);
  174.     } else
  175.     if (_tcscmp (_tcsupr (argv [3]), TEXT("REMOVE")) == 0)
  176.     {
  177.         returnValue = ChangeDefaultLaunchACL (argv[3], FALSE, FALSE);
  178.  
  179.         if (returnValue != ERROR_SUCCESS)
  180.             Error (TEXT("ERROR: Cannot remove user from default launch ACL."), returnValue);
  181.     } else
  182.         ShowUsage (TEXT("You can only \"set\" or \"remove\" a user."));
  183. }
  184.  
  185. void
  186. HandleAAOption (
  187.     int argc,
  188.     TCHAR **argv
  189.     )
  190. {
  191.     DWORD returnValue;
  192.     HKEY  registryKey;
  193.     TCHAR appid [256];
  194.     TCHAR keyName [256];
  195.  
  196.     if (argc < 4)
  197.         ShowUsage (TEXT("Invalid number of arguments."));
  198.  
  199.     if (_tcscmp (_tcsupr (argv[3]), TEXT("LIST")) == 0)
  200.     {
  201.         if (argc < 4)
  202.             ShowUsage (TEXT("Invalid number of arguments."));
  203.  
  204.         _tprintf (TEXT("Access permission list for AppID %s:\n\n"), argv[2]);
  205.         ListAppIDAccessACL (argv[2]);
  206.         return;
  207.     }
  208.  
  209.     if (_tcscmp (_tcsupr (argv[3]), TEXT("DEFAULT")) == 0)
  210.     {
  211.         if (argv [2][0] == '{')
  212.             wsprintf (appid, TEXT("%s"), argv [2]); else
  213.             wsprintf (appid, TEXT("{%s}"), argv [2]);
  214.  
  215.         wsprintf (keyName, TEXT("APPID\\%s"), appid);
  216.  
  217.         returnValue = RegOpenKeyEx (HKEY_CLASSES_ROOT, keyName, 0, KEY_ALL_ACCESS, ®istryKey);
  218.         if (returnValue != ERROR_SUCCESS && returnValue != ERROR_FILE_NOT_FOUND)
  219.             Error (TEXT("ERROR: Cannot open AppID registry key."), returnValue);
  220.  
  221.         returnValue = RegDeleteValue (registryKey, TEXT("AccessPermission"));
  222.         if (returnValue != ERROR_SUCCESS && returnValue != ERROR_FILE_NOT_FOUND)
  223.             Error (TEXT("ERROR: Cannot delete AccessPermission value."), returnValue);
  224.  
  225.         RegCloseKey (registryKey);
  226.         return;
  227.     }
  228.  
  229.     if (argc < 5)
  230.         ShowUsage (TEXT("Invalid number of arguments."));
  231.  
  232.     if (_tcscmp (_tcsupr (argv [3]), TEXT("SET")) == 0)
  233.     {
  234.         if (argc < 6)
  235.             ShowUsage (TEXT("Invalid number of arguments."));
  236.  
  237.         if (_tcscmp (_tcsupr (argv [5]), TEXT("PERMIT")) == 0)
  238.             returnValue = ChangeAppIDAccessACL (argv[2], argv [4], TRUE, TRUE); else
  239.  
  240.         if (_tcscmp (_tcsupr (argv [5]), TEXT("DENY")) == 0)
  241.             returnValue = ChangeAppIDAccessACL (argv[2], argv [4], TRUE, FALSE); else
  242.         {
  243.             ShowUsage (TEXT("You can only set a user's permissions to \"permit\" or \"deny\".\n\n"));
  244.         }
  245.  
  246.         if (returnValue != ERROR_SUCCESS)
  247.             Error (TEXT("ERROR: Cannot add user to application access ACL."), returnValue);
  248.     } else
  249.     if (_tcscmp (_tcsupr (argv [3]), TEXT("REMOVE")) == 0)
  250.     {
  251.         returnValue = ChangeAppIDAccessACL (argv[2], argv[4], FALSE, FALSE);
  252.  
  253.         if (returnValue != ERROR_SUCCESS)
  254.             Error (TEXT("ERROR: Cannot remove user from application access ACL."), returnValue);
  255.     } else
  256.         ShowUsage (TEXT("You can only \"set\" or \"remove\" a user."));
  257. }
  258.  
  259. void
  260. HandleALOption (
  261.     int argc,
  262.     TCHAR **argv
  263.     )
  264. {
  265.     DWORD returnValue;
  266.     HKEY  registryKey;
  267.     TCHAR appid [256];
  268.     TCHAR keyName [256];
  269.  
  270.     if (argc < 4)
  271.         ShowUsage (TEXT("Invalid number of arguments."));
  272.  
  273.     if (_tcscmp (_tcsupr (argv[3]), TEXT("LIST")) == 0)
  274.     {
  275.         if (argc < 4)
  276.             ShowUsage (TEXT("Invalid number of arguments.\n"));
  277.  
  278.         _tprintf (TEXT("Launch permission list for AppID %s:\n\n"), argv[2]);
  279.         ListAppIDLaunchACL (argv[2]);
  280.         return;
  281.     }
  282.  
  283.     if (_tcscmp (_tcsupr (argv[3]), TEXT("DEFAULT")) == 0)
  284.     {
  285.         if (argv [2][0] == '{')
  286.             wsprintf (appid, TEXT("%s"), argv [2]); else
  287.             wsprintf (appid, TEXT("{%s}"), argv [2]);
  288.  
  289.         wsprintf (keyName, TEXT("APPID\\%s"), appid);
  290.  
  291.         returnValue = RegOpenKeyEx (HKEY_CLASSES_ROOT, keyName, 0, KEY_ALL_ACCESS, ®istryKey);
  292.         if (returnValue != ERROR_SUCCESS && returnValue != ERROR_FILE_NOT_FOUND)
  293.             Error (TEXT("ERROR: Cannot open AppID registry key."), returnValue);
  294.  
  295.         returnValue = RegDeleteValue (registryKey, TEXT("LaunchPermission"));
  296.         if (returnValue != ERROR_SUCCESS && returnValue != ERROR_FILE_NOT_FOUND)
  297.             Error (TEXT("ERROR: Cannot delete LaunchPermission value."), returnValue);
  298.  
  299.         RegCloseKey (registryKey);
  300.         return;
  301.     }
  302.  
  303.     if (argc < 5)
  304.         ShowUsage (TEXT("Invalid number of arguments."));
  305.  
  306.     if (_tcscmp (_tcsupr (argv [3]), TEXT("SET")) == 0)
  307.     {
  308.         if (argc < 6)
  309.             ShowUsage (TEXT("Invalid number of arguments."));
  310.  
  311.         if (_tcscmp (_tcsupr (argv [5]), TEXT("PERMIT")) == 0)
  312.             returnValue = ChangeAppIDLaunchACL (argv[2], argv [4], TRUE, TRUE); else
  313.  
  314.         if (_tcscmp (_tcsupr (argv [5]), TEXT("DENY")) == 0)
  315.             returnValue = ChangeAppIDLaunchACL (argv[2], argv [4], TRUE, FALSE); else
  316.         {
  317.             ShowUsage (TEXT("You can only set a user's permissions to \"permit\" or \"deny\".\n\n"));
  318.         }
  319.  
  320.         if (returnValue != ERROR_SUCCESS)
  321.             Error (TEXT("ERROR: Cannot add user to application launch ACL."), returnValue);
  322.     } else
  323.     if (_tcscmp (_tcsupr (argv [3]), TEXT("REMOVE")) == 0)
  324.     {
  325.         returnValue = ChangeAppIDLaunchACL (argv[2], argv[4], FALSE, FALSE);
  326.  
  327.         if (returnValue != ERROR_SUCCESS)
  328.             Error (TEXT("ERROR: Cannot remove user from application launch ACL."), returnValue);
  329.     } else
  330.         ShowUsage (TEXT("You can only \"set\" or \"remove\" a user."));
  331. }
  332.  
  333. void
  334. HandleRunAsOption (
  335.     int argc,
  336.     TCHAR **argv
  337.     )
  338. {
  339.     DWORD returnValue;
  340.     HKEY  registryKey;
  341.     TCHAR appid [256];
  342.     TCHAR keyName [256];
  343.  
  344.     if (argc < 4)
  345.         ShowUsage (TEXT("Invalid number of arguments."));
  346.  
  347.     if (argv [2][0] == '{')
  348.         wsprintf (appid, TEXT("%s"), argv [2]); else
  349.         wsprintf (appid, TEXT("{%s}"), argv [2]);
  350.  
  351.     wsprintf (keyName, TEXT("APPID\\%s"), appid);
  352.  
  353.     returnValue = RegOpenKeyEx (HKEY_CLASSES_ROOT, keyName, 0, KEY_ALL_ACCESS, ®istryKey);
  354.     if (returnValue != ERROR_SUCCESS)
  355.         Error (TEXT("ERROR: Cannot open AppID registry key."), returnValue);
  356.  
  357.     returnValue = RegSetValueEx (registryKey, TEXT("RunAs"), 0, REG_SZ, (LPBYTE) argv [3], _tcslen (argv[3]) * sizeof (TCHAR));
  358.     if (returnValue != ERROR_SUCCESS)
  359.         Error (TEXT("ERROR: Cannot set RunAs registry value."), returnValue);
  360.  
  361.     RegCloseKey (registryKey);
  362.  
  363.     if (_tcscmp (_tcsupr (argv[3]), TEXT("INTERACTIVE USER")) != 0)
  364.     {
  365.         if (argc < 5)
  366.             ShowUsage (TEXT("Invalid number of arguments."));
  367.  
  368.         returnValue = SetRunAsPassword (argv[2], argv[3], argv[4]);
  369.         if (returnValue != ERROR_SUCCESS)
  370.             Error (TEXT("ERROR: Cannot set RunAs password."), returnValue);
  371.     }
  372. }
  373.  
  374. extern "C" void
  375. _tmain (
  376.     int argc,
  377.     TCHAR **argv
  378.     )
  379. {
  380.     if (argc < 2)
  381.         ShowUsage (TEXT("No option specified."));
  382.  
  383.     if (_tcscmp (_tcsupr (argv [1]), TEXT("-DA")) == 0)
  384.         HandleDAOption (argc, argv); else
  385.  
  386.     if (_tcscmp (_tcsupr (argv [1]), TEXT("-DL")) == 0)
  387.         HandleDLOption (argc, argv); else
  388.  
  389.     if (_tcscmp (_tcsupr (argv [1]), TEXT("-AA")) == 0)
  390.         HandleAAOption (argc, argv); else
  391.  
  392.     if (_tcscmp (_tcsupr (argv [1]), TEXT("-AL")) == 0)
  393.         HandleALOption (argc, argv); else
  394.  
  395.     if (_tcscmp (_tcsupr (argv [1]), TEXT("-RUNAS")) == 0)
  396.         HandleRunAsOption (argc, argv); else
  397.  
  398.     ShowUsage (TEXT("Invalid option specified."));
  399. }
  400.