| //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 |
| } |