36b3af2e3d
PR Check / Code Quality: Format (push) Failing after 1s
PR Check / Code Quality: Lint (darwin) (push) Failing after 0s
PR Check / Code Quality: Lint (freebsd) (push) Failing after 1s
PR Check / Code Quality: Lint (windows) (push) Failing after 1s
PR Check / Code Quality: Lint (linux) (push) Failing after 1s
PR Check / Security: Vulnerability Scan (push) Failing after 0s
Update Documentation / update-docs (push) Failing after 2s
PR Check / Code Quality: Vendor (push) Failing after 1s
PR Check / Code Quality: Coverage (push) Failing after 0s
PR Check / Tests: Unit (macos-latest) (push) Has been cancelled
PR Check / Tests: Unit (ubuntu-24.04) (push) Has been cancelled
PR Check / Tests: Unit (ubuntu-24.04-arm) (push) Has been cancelled
PR Check / Tests: Unit (windows-latest) (push) Has been cancelled
55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
//go:build windows
|
|
|
|
package proc
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall"
|
|
)
|
|
|
|
func readUser(pid int) string {
|
|
// 1. Open Process
|
|
// PROCESS_QUERY_LIMITED_INFORMATION (0x1000) is enough for Token and allows better access coverage
|
|
// than PROCESS_QUERY_INFORMATION (0x0400).
|
|
const PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
|
|
hProcess, err := syscall.OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, uint32(pid))
|
|
if err != nil {
|
|
// Fallback to PROCESS_QUERY_INFORMATION if LIMITED not available or failed?
|
|
// Usually 0x400 is stricter.
|
|
// Try standard if fails?
|
|
hProcess, err = syscall.OpenProcess(syscall.PROCESS_QUERY_INFORMATION, false, uint32(pid))
|
|
if err != nil {
|
|
return "unknown"
|
|
}
|
|
}
|
|
defer syscall.CloseHandle(hProcess)
|
|
|
|
// 2. Open Process Token
|
|
var token syscall.Token
|
|
err = syscall.OpenProcessToken(hProcess, syscall.TOKEN_QUERY, &token)
|
|
if err != nil {
|
|
return "unknown"
|
|
}
|
|
defer token.Close()
|
|
|
|
// 3. Get Token User (SID)
|
|
tokenUser, err := token.GetTokenUser()
|
|
if err != nil {
|
|
return "unknown"
|
|
}
|
|
|
|
// 4. Lookup Account SID
|
|
// tokenUser.User.Sid is *syscall.SID
|
|
user, domain, _, err := tokenUser.User.Sid.LookupAccount("")
|
|
if err != nil {
|
|
return "unknown"
|
|
}
|
|
|
|
if domain == "" {
|
|
return user
|
|
}
|
|
return fmt.Sprintf("%s\\%s", domain, user)
|
|
}
|
|
|
|
// Helpers if needed, but syscall.Token has GetTokenUser and lookup methods in standard library (windows)
|