mirror of
https://github.com/status-im/consul.git
synced 2025-02-09 12:25:17 +00:00
95c027a3ea
https://github.com/shirou/gopsutil/pull/895 is merged and fixes our problem. Time to update. Since there is no new version just yet, updating to the sha.
60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
// Copyright 2012 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build windows
|
|
|
|
package svc
|
|
|
|
import (
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
func allocSid(subAuth0 uint32) (*windows.SID, error) {
|
|
var sid *windows.SID
|
|
err := windows.AllocateAndInitializeSid(&windows.SECURITY_NT_AUTHORITY,
|
|
1, subAuth0, 0, 0, 0, 0, 0, 0, 0, &sid)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return sid, nil
|
|
}
|
|
|
|
// IsAnInteractiveSession determines if calling process is running interactively.
|
|
// It queries the process token for membership in the Interactive group.
|
|
// http://stackoverflow.com/questions/2668851/how-do-i-detect-that-my-application-is-running-as-service-or-in-an-interactive-s
|
|
func IsAnInteractiveSession() (bool, error) {
|
|
interSid, err := allocSid(windows.SECURITY_INTERACTIVE_RID)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
defer windows.FreeSid(interSid)
|
|
|
|
serviceSid, err := allocSid(windows.SECURITY_SERVICE_RID)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
defer windows.FreeSid(serviceSid)
|
|
|
|
t, err := windows.OpenCurrentProcessToken()
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
defer t.Close()
|
|
|
|
gs, err := t.GetTokenGroups()
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
for _, g := range gs.AllGroups() {
|
|
if windows.EqualSid(g.Sid, interSid) {
|
|
return true, nil
|
|
}
|
|
if windows.EqualSid(g.Sid, serviceSid) {
|
|
return false, nil
|
|
}
|
|
}
|
|
return false, nil
|
|
}
|