// @pymethod tuple|PyACL|GetAce|Gets an Ace from the ACL // @rdesc Conventional ACE's (types ACCESS_ALLOWED_ACE, ACCESS_DENIED_ACE, SYSTEM_AUDIT_ACE) are returned // as a tuple of: // @tupleitem 0|(int, int)|aceType, AceFlags| // @tupleitem 1|int|Mask| // @tupleitem 2|<o PySID>|sid| // <nl>Object ACE's (types ACCESS_ALLOWED_OBJECT_ACE, ACCESS_DENIED_OBJECT_ACE, SYSTEM_AUDIT_OBJECT_ACE) // are returned as a tuple: // @tupleitem 0|(int, int)|aceType, AceFlags| // @tupleitem 1|int|mask| // @tupleitem 2|<o PyIID>|ObjectType| // @tupleitem 3|<o PyIID>|InheritedObjectType| // @tupleitem 4|<o PySID>|sid| // <nl>For details see the API documentation. PyObject *PyACL::GetAce(PyObject *self, PyObject *args) { DWORD index; ACE_HEADER *pAceHeader; LPVOID p; PyACL *This = (PyACL *)self; // @pyparm int|index||Zero-based index of the ACE to retrieve. if (!PyArg_ParseTuple(args, "l:GetAce", &index)) return NULL; if (!::GetAce(This->GetACL(), index, &p)) return PyWin_SetAPIError("GetAce"); pAceHeader=(ACE_HEADER *)p; switch (pAceHeader->AceType){ case ACCESS_ALLOWED_ACE_TYPE: case ACCESS_DENIED_ACE_TYPE: case SYSTEM_AUDIT_ACE_TYPE: #ifdef _WIN32_WINNT_LONGHORN case SYSTEM_MANDATORY_LABEL_ACE_TYPE: #endif { ACCESS_ALLOWED_ACE *pAce=(ACCESS_ALLOWED_ACE *)p; return Py_BuildValue("(ll)lN", pAceHeader->AceType, pAceHeader->AceFlags, pAce->Mask, PyWinObject_FromSID((PSID)(&pAce->SidStart))); } case ACCESS_ALLOWED_OBJECT_ACE_TYPE: case ACCESS_DENIED_OBJECT_ACE_TYPE: case SYSTEM_AUDIT_OBJECT_ACE_TYPE:{ PyObject *obSID, *obObjectType=NULL, *obInheritedObjectType=NULL; ACCESS_ALLOWED_OBJECT_ACE *pObjectAce=(ACCESS_ALLOWED_OBJECT_ACE *)p; if (!(pObjectAce->Flags&ACE_OBJECT_TYPE_PRESENT)){ Py_INCREF(Py_None); obObjectType=Py_None; } if (!(pObjectAce->Flags&ACE_INHERITED_OBJECT_TYPE_PRESENT)){ Py_INCREF(Py_None); obInheritedObjectType=Py_None; } // Struct members float depending on presence of GUIDs ! if ((obObjectType==Py_None) && (obInheritedObjectType==Py_None)) // neither GUID present, SID will be in first GUID position obSID=PyWinObject_FromSID((PSID)&pObjectAce->ObjectType); else if ((obObjectType==NULL) && (obInheritedObjectType==NULL)){ // both present, SID in normal place obObjectType=PyWinObject_FromIID(pObjectAce->ObjectType); obInheritedObjectType=PyWinObject_FromIID(pObjectAce->InheritedObjectType); obSID=PyWinObject_FromSID((PSID)&pObjectAce->SidStart); } else{ // one present in position of first GUID, SID with be in position of second GUID obSID=PyWinObject_FromSID((PSID)&pObjectAce->InheritedObjectType); if (obObjectType==NULL) obObjectType=PyWinObject_FromIID(pObjectAce->ObjectType); else obInheritedObjectType=PyWinObject_FromIID(pObjectAce->ObjectType); } return Py_BuildValue("(ll)lNNN", pAceHeader->AceType, pAceHeader->AceFlags, pObjectAce->Mask, obObjectType, obInheritedObjectType, obSID); } default: PyErr_Format(PyExc_NotImplementedError, "Ace type %d is not supported yet", pAceHeader->AceType); return NULL; } }
PyObject *PyWinObject_FromTRUSTEE(TRUSTEE_W *ptrustee) { PyObject *obIdentifier=NULL; switch (ptrustee->TrusteeForm){ case TRUSTEE_IS_SID:{ obIdentifier=PyWinObject_FromSID(ptrustee->ptstrName); break; } case TRUSTEE_IS_NAME:{ obIdentifier=PyWinObject_FromWCHAR(ptrustee->ptstrName); break; } #if WINVER >= 0x0501 case TRUSTEE_IS_OBJECTS_AND_SID: case TRUSTEE_IS_OBJECTS_AND_NAME:{ PyErr_SetString(PyExc_NotImplementedError, "TrusteeForm not yet supported"); return FALSE; } #endif default:{ PyErr_SetString(PyExc_ValueError, "Invalid value for TrusteeForm"); return FALSE; } } if (!obIdentifier) return NULL; return Py_BuildValue("{s:O,s:l,s:l,s:l,s:N}", "MultipleTrustee",Py_None, "MultipleTrusteeOperation",NO_MULTIPLE_TRUSTEE, "TrusteeForm",ptrustee->TrusteeForm, "TrusteeType",ptrustee->TrusteeType, "Identifier",obIdentifier); }
// @pymethod (<o PyUnicode>,...)|win32ts|WTSEnumerateProcesses|Lists processes on a terminal server static PyObject *PyWTSEnumerateProcesses(PyObject *self, PyObject *args, PyObject *kwargs) { static char *keywords[]={"Server","Version","Reserved", NULL}; HANDLE h=WTS_CURRENT_SERVER_HANDLE; DWORD Reserved=0, Version=1, cnt; PyObject *obh=NULL, *ret=NULL; PWTS_PROCESS_INFO buf=NULL; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Okk:WTSEnumerateProcesses", keywords, &obh, // @pyparm <o PyHANDLE>|Server|WTS_CURRENT_SERVER_HANDLE|Handle to a terminal server &Version, // @pyparm int|Version|1|Version of request, currently 1 is only valid value &Reserved)) // @pyparm int|Reserved|0|Reserved, use 0 if passed in return NULL; if (obh) if (!PyWinObject_AsHANDLE(obh, &h)) return NULL; if (!WTSEnumerateProcesses(h,Reserved,Version, &buf, &cnt)) PyWin_SetAPIError("WTSEnumerateProcesses"); else{ ret=PyTuple_New(cnt); if (ret) for (DWORD i=0; i<cnt; i++){ PyObject *tuple_item=Py_BuildValue("kkNN", buf[i].SessionId, buf[i].ProcessId, PyWinObject_FromWCHAR(buf[i].pProcessName), PyWinObject_FromSID(buf[i].pUserSid)); if (!tuple_item){ Py_DECREF(ret); ret=NULL; break; } PyTuple_SET_ITEM(ret, i, tuple_item); } } if (buf) WTSFreeMemory(buf); return ret; }