#include "pch.h" #include "makesd.h" #include #define MAILRM_IDENTIFIER_AUTHORITY { 0, 0, 0, 0, 0, 42 } SID sInsecureSid = { SID_REVISION, 1, MAILRM_IDENTIFIER_AUTHORITY, 1 }; SID sBobSid = { SID_REVISION, 1, MAILRM_IDENTIFIER_AUTHORITY, 2 }; SID sMarthaSid= { SID_REVISION, 1, MAILRM_IDENTIFIER_AUTHORITY, 3 }; SID sJoeSid = { SID_REVISION, 1, MAILRM_IDENTIFIER_AUTHORITY, 4 }; SID sJaneSid = { SID_REVISION, 1, MAILRM_IDENTIFIER_AUTHORITY, 5 }; SID sMailAdminsSid = { SID_REVISION, 1, MAILRM_IDENTIFIER_AUTHORITY, 6 }; PSID InsecureSid = &sInsecureSid; PSID BobSid = &sBobSid; PSID MarthaSid= &sMarthaSid; PSID JoeSid = &sJoeSid; PSID JaneSid = &sJaneSid; PSID MailAdminsSid = &sMailAdminsSid; // // Principal self SID. When used in an ACE, the Authz access check replaces it // by the passed in PrincipalSelfSid parameter during the access check. In this // case, it is replaced by the owner's SID retrieved from the mailbox. // SID sPrincipalSelfSid = { SID_REVISION, 1, SECURITY_NT_AUTHORITY, SECURITY_PRINCIPAL_SELF_RID }; SID sNetworkSid = { SID_REVISION, 1, SECURITY_NT_AUTHORITY, SECURITY_NETWORK_RID }; SID sAuthenticatedSid = { SID_REVISION, 1, SECURITY_NT_AUTHORITY, SECURITY_AUTHENTICATED_USER_RID, }; SID sDialupSid = { SID_REVISION, 1, SECURITY_NT_AUTHORITY, SECURITY_DIALUP_RID, }; PSID PrincipalSelfSid = &sPrincipalSelfSid; PSID NetworkSid = &sNetworkSid; PSID AuthenticatedSid = &sAuthenticatedSid; PSID DialupSid = &sDialupSid; void __cdecl wmain(int argc, WCHAR *argv[]) { PSECURITY_DESCRIPTOR pSd; BOOL bSuccess; if( argc != 2 ) { printf("Error: makesd \n"); } bSuccess = CreateSecurityDescriptor2( &pSd, // SD 0, // SD Control PrincipalSelfSid, // owner NULL, // group TRUE, // DACL present 3, // 3 DACL ACEs FALSE, // SACL not present 0, // 0 SACL ACEs // Var argl list ACCESS_DENIED_ACE_TYPE, OBJECT_INHERIT_ACE, DialupSid, FILE_GENERIC_READ, ACCESS_ALLOWED_ACE_TYPE, OBJECT_INHERIT_ACE, AuthenticatedSid, FILE_GENERIC_READ, ACCESS_ALLOWED_CALLBACK_ACE_TYPE, OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE, PrincipalSelfSid, FILE_GENERIC_READ | FILE_GENERIC_WRITE | FILE_GENERIC_EXECUTE, 0, NULL ); if( !bSuccess ) { printf("Error: %u\n", GetLastError()); exit(0); } bSuccess = IsValidSecurityDescriptor(pSd); if( !bSuccess ) { printf("Error: Invalid security descriptor\n"); exit(0); } bSuccess = SetFileSecurity( argv[1], DACL_SECURITY_INFORMATION, pSd); if( !bSuccess ) { printf("Error setting sec: %u\n", GetLastError()); exit(0); } FreeSecurityDescriptor2(pSd); printf("Success\n"); }