J'ai un code C++ hérité qui modifie un DACL de processus et j'essaie d'utiliser les classes de code managé dans .NET 3.5. J'ai trouvé du code sur le Web où quelqu'un a créé une classe SetAclOnServices qui étend la classe NativeObjectSecurity pour les services. J'ai pensé que je pourrais implémenter ceci et juste changer le ResourceType.Service à ResourceType.KernelObject mais quand j'appelle GetAccessControl il échoue avec l'erreur de dossier non trouvée.Y at-il un moyen de modifier un processus DACL en C#
6
A
Répondre
10
Joyeux Noël.
public class ProcessSecurity : NativeObjectSecurity
{
public ProcessSecurity(SafeHandle processHandle)
: base(false, ResourceType.KernelObject, processHandle, AccessControlSections.Access)
{
}
public void AddAccessRule(ProcessAccessRule rule)
{
base.AddAccessRule(rule);
}
// this is not a full impl- it only supports writing DACL changes
public void SaveChanges(SafeHandle processHandle)
{
Persist(processHandle, AccessControlSections.Access);
}
public override Type AccessRightType
{
get { return typeof(ProcessAccessRights); }
}
public override AccessRule AccessRuleFactory(System.Security.Principal.IdentityReference identityReference, int accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type)
{
return new ProcessAccessRule(identityReference, (ProcessAccessRights)accessMask, isInherited, inheritanceFlags, propagationFlags, type);
}
public override Type AccessRuleType
{
get { return typeof(ProcessAccessRule); }
}
public override AuditRule AuditRuleFactory(System.Security.Principal.IdentityReference identityReference, int accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AuditFlags flags)
{
throw new NotImplementedException();
}
public override Type AuditRuleType
{
get { throw new NotImplementedException(); }
}
}
public class ProcessAccessRule : AccessRule
{
public ProcessAccessRule(IdentityReference identityReference, ProcessAccessRights accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type)
: base(identityReference, (int)accessMask, isInherited, inheritanceFlags, propagationFlags, type)
{
}
public ProcessAccessRights ProcessAccessRights { get { return (ProcessAccessRights)AccessMask; } }
}
[Flags]
public enum ProcessAccessRights
{
STANDARD_RIGHTS_REQUIRED = (0x000F0000),
DELETE = (0x00010000), // Required to delete the object.
READ_CONTROL = (0x00020000), // Required to read information in the security descriptor for the object, not including the information in the SACL. To read or write the SACL, you must request the ACCESS_SYSTEM_SECURITY access right. For more information, see SACL Access Right.
WRITE_DAC = (0x00040000), // Required to modify the DACL in the security descriptor for the object.
WRITE_OWNER = (0x00080000), // Required to change the owner in the security descriptor for the object.
PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF, //All possible access rights for a process object.
PROCESS_CREATE_PROCESS = (0x0080), // Required to create a process.
PROCESS_CREATE_THREAD = (0x0002), // Required to create a thread.
PROCESS_DUP_HANDLE = (0x0040), // Required to duplicate a handle using DuplicateHandle.
PROCESS_QUERY_INFORMATION = (0x0400), // Required to retrieve certain information about a process, such as its token, exit code, and priority class (see OpenProcessToken, GetExitCodeProcess, GetPriorityClass, and IsProcessInJob).
PROCESS_QUERY_LIMITED_INFORMATION = (0x1000),
PROCESS_SET_INFORMATION = (0x0200), // Required to set certain information about a process, such as its priority class (see SetPriorityClass).
PROCESS_SET_QUOTA = (0x0100), // Required to set memory limits using SetProcessWorkingSetSize.
PROCESS_SUSPEND_RESUME = (0x0800), // Required to suspend or resume a process.
PROCESS_TERMINATE = (0x0001), // Required to terminate a process using TerminateProcess.
PROCESS_VM_OPERATION = (0x0008), // Required to perform an operation on the address space of a process (see VirtualProtectEx and WriteProcessMemory).
PROCESS_VM_READ = (0x0010), // Required to read memory in a process using ReadProcessMemory.
PROCESS_VM_WRITE = (0x0020), // Required to write to memory in a process using WriteProcessMemory.
SYNCHRONIZE = (0x00100000), // Required to wait for the process to terminate using the wait functions.
}
Questions connexes
- 1. Autorisations WiX, comment exprimer «Modifier» en termes d'indicateurs DACL
- 2. C# utilise la réflexion pour modifier un processus en cours
- 3. Y at-il un moyen de mettre fin à un processus bloqué dans Powershell?
- 4. Modifier le nom du processus en C#?
- 5. modifier un fichier ouvert C++
- 6. Y at-il un moyen dans Windows de savoir si un processus ne répond pas?
- 7. Y at-il un moyen de modifier les en-têtes HTTP pour IE6?
- 8. Y at-il un moyen rapide de formater un XmlDocument pour l'affichage en C#?
- 9. Y at-il un moyen facile de faire un tas min en C++?
- 10. Y at-il un moyen de créer ou de modifier VS raccourcis clavier
- 11. Y at-il un moyen de modifier le menu contextuel d'un navigateur Web en utilisant Wpf (C#)
- 12. Modifier un champ de table en y ajoutant
- 13. C# 2.0 - Y a-t-il un moyen de faire un `GroupBy` avec un bloc d'itération?
- 14. Comment utiliser un ID de processus donné par un processus dans un autre processus en utilisant C#
- 15. Modifier un attribut XML unique en C#
- 16. Y at-il un moyen d'injecter un comportement à csrss.exe et modifier/améliorer la console Windows?
- 17. Un processus peut-il verrouiller un disque afin qu'aucun autre processus ne puisse y accéder?
- 18. Y a-t-il un moyen de signer un XDocument?
- 19. Y at-il un moyen de lancer un autre programme sans avoir à faire une fourchette()?
- 20. Y a-t-il un moyen de passer un type de structure à une fonction c
- 21. Y at-il un moyen de connaître la progression d'un processus asynchrone EJB?
- 22. Y at-il un moyen de "défaire" l'effet de #line en C?
- 23. Y at-il un moyen de changer de répertoire en utilisant le langage C?
- 24. Existe-t-il un moyen de rendre le processus Doxygen non documenté en C automatiquement?
- 25. Obtenir le processus parent/Redémarrer un processus C#
- 26. Y at-il un moyen de vider les objets en mémoire à partir d'un processus Ruby en cours d'exécution?
- 27. Démarrer un processus en Java?
- 28. Y at-il un moyen d'ajouter « -lpthread » par défaut drapeau de linker sans modifier le makefile
- 29. Y at-il un moyen de modifier les attributs d'une classe?
- 30. Flex - Y a-t-il un moyen de modifier le message d'erreur "Canal déconnecté"?
Merci et Joyeux Noël à vous aussi! J'ai implémenté ceci, en ajoutant une classe SafeHandle et mon descripteur de sécurité de processus peut être modifié mais il ne semble pas faire ce que je veux qu'il fasse. J'essaye de nier que le programme se termine correctement. Je reçois le descripteur de sécurité avant et après l'ajout d'une règle de refus et il semble que cela devrait fonctionner, mais je peux toujours terminer le programme. Dois-je définir le contrôle d'accès sur le descripteur de sécurité du processus? –
Cela peut avoir un rapport avec le fait que vous êtes le propriétaire. Il peut y avoir des cas spéciaux non documentés autour de l'extension de privilège automatique pour les ACL de processus. Un ACE * refusant * doit toujours avoir la priorité sur un permis. Peut-être essayer de changer le propriétaire pour voir si cela a un effet. – nitzmahone
Désolé, oui, vous devrez ajouter un appel à la méthode Persist protégée pour écrire réellement la liste de contrôle d'accès au processus. Je n'ai pas regardé NativeObjectSecurity de près. J'ai ajouté une méthode "SaveChanges" qui passe le handle de processus à Persist, et cela a fait l'affaire. – nitzmahone