43 lines
1.4 KiB
Go
43 lines
1.4 KiB
Go
//go:build windows
|
|
|
|
package glog
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
)
|
|
|
|
// shouldRegisterStderrSink determines whether we should register a log sink that writes to stderr.
|
|
// Today, this checks if stderr is "valid", in that it maps to a non-NULL Handle.
|
|
// Windows Services are spawned without Stdout and Stderr, so any attempt to use them equates to
|
|
// referencing an invalid file Handle.
|
|
// os.Stderr's FD is derived from a call to `syscall.GetStdHandle(syscall.STD_ERROR_HANDLE)`.
|
|
// Documentation[1] for the GetStdHandle function indicates the return value may be NULL if the
|
|
// application lacks the standard handle, so consider Stderr valid if its FD is non-NULL.
|
|
// [1]: https://learn.microsoft.com/en-us/windows/console/getstdhandle
|
|
func shouldRegisterStderrSink() bool {
|
|
return os.Stderr.Fd() != 0
|
|
}
|
|
|
|
// This follows the logic in the standard library's user.Current() function, except
|
|
// that it leaves out the potentially expensive calls required to look up the user's
|
|
// display name in Active Directory.
|
|
func lookupUser() string {
|
|
token, err := syscall.OpenCurrentProcessToken()
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
defer token.Close()
|
|
tokenUser, err := token.GetTokenUser()
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
username, _, accountType, err := tokenUser.User.Sid.LookupAccount("")
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
if accountType != syscall.SidTypeUser {
|
|
return ""
|
|
}
|
|
return username
|
|
}
|