This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author eryksun
Recipients eryksun, paul.moore, steve.dower, tim.golden, zach.ware
Date 2022-02-05.03:39:16
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1644032356.47.0.0313408712095.issue46631@roundup.psfhosted.org>
In-reply-to
Content
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;
    }
History
Date User Action Args
2022-02-05 03:39:16eryksunsetrecipients: + eryksun, paul.moore, tim.golden, zach.ware, steve.dower
2022-02-05 03:39:16eryksunsetmessageid: <1644032356.47.0.0313408712095.issue46631@roundup.psfhosted.org>
2022-02-05 03:39:16eryksunlinkissue46631 messages
2022-02-05 03:39:16eryksuncreate