Eryk Sun <[email protected]> added the comment:
Here's an example for the suggested changes to _winapi.
Include these headers:
#include <ntsecapi.h> // LsaGetLogonSessionData
#include <subauth.h> // STATUS_SUCCESS
Add these argument-clinic macros to _winapi_functions:
_WINAPI_GETCURRENTPROCESSTOKEN_METHODDEF
_WINAPI_GETTOKENINFORMATION_METHODDEF
_WINAPI_LSAGETLOGONSESSIONDATA_METHODDEF
Add TokenStatistics in winapi_exec():
WINAPI_CONSTANT(F_DWORD, TokenStatistics);
Add minimal implementations that wrap the WinAPI functions:
/*[clinic input]
_winapi.GetCurrentProcessToken -> HANDLE
Return a handle for the access token of the current process.
[clinic start generated code]*/
static HANDLE
_winapi_GetCurrentProcessToken_impl(PyObject *module)
/*[clinic end generated code: output=cf8e8e20dd41dd6e
input=73a282cf3718af9e]*/
{
return GetCurrentProcessToken();
}
/*[clinic input]
_winapi.GetTokenInformation
handle: HANDLE
information_class: unsigned_long
/
Get information from an access token.
[clinic start generated code]*/
static PyObject *
_winapi_GetTokenInformation_impl(PyObject *module, HANDLE handle,
unsigned long information_class)
/*[clinic end generated code: output=caecec0a25658348
input=b277ad2414f1b03e]*/
{
if (information_class != TokenStatistics) {
return PyErr_Format(
PyExc_NotImplementedError,
"Unsupported information class: %d",
information_class);
}
DWORD returned_size;
TOKEN_STATISTICS info;
if (!GetTokenInformation(handle, information_class, &info, sizeof(info),
&returned_size)) {
return PyErr_SetFromWindowsErr(0);
}
PyObject *result = PyDict_New();
if (!result) {
return NULL;
}
PyObject *value = PyLong_FromUnsignedLongLong(
(((uint64_t)info.AuthenticationId.HighPart) << 32) +
info.AuthenticationId.LowPart);
if (!value) {
goto error;
}
if (PyDict_SetItemString(result, "AuthenticationId", value) < 0) {
Py_DECREF(value);
goto error;
}
Py_DECREF(value);
return result;
error:
Py_CLEAR(result);
return NULL;
}
/*[clinic input]
_winapi.LsaGetLogonSessionData
logon_id: unsigned_long_long
/
Get data for the logon session identified by logon_id.
[clinic start generated code]*/
static PyObject *
_winapi_LsaGetLogonSessionData_impl(PyObject *module,
unsigned long long logon_id)
/*[clinic end generated code: output=680ac7725ef34527
input=01ff4216b89d01ef]*/
{
SECURITY_LOGON_SESSION_DATA *pdata;
LUID logon_luid;
logon_luid.HighPart = logon_id >> 32;
logon_luid.LowPart = logon_id & 0xFFFFFFFF;
NTSTATUS status = LsaGetLogonSessionData(&logon_luid, &pdata);
if (status != STATUS_SUCCESS) {
return PyErr_SetFromWindowsErr(LsaNtStatusToWinError(status));
}
PyObject *result = PyDict_New();
if (!result) {
goto error;
}
PyObject *value = PyUnicode_FromWideChar(pdata->UserName.Buffer,
pdata->UserName.Length / sizeof(WCHAR));
if (!value) {
goto error;
}
if (PyDict_SetItemString(result, "UserName", value) < 0) {
Py_DECREF(value);
goto error;
}
Py_DECREF(value);
LsaFreeReturnBuffer(pdata);
return result;
error:
LsaFreeReturnBuffer(pdata);
Py_CLEAR(result);
return NULL;
}
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue46631>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com