// GetTokenUser returns the User associated with the given Token. func GetTokenUser(token syscall.Token) (User, error) { tokenUser, err := token.GetTokenUser() if err != nil { return User{}, errors.Wrap(err, "GetTokenUser failed") } var user User user.SID, err = tokenUser.User.Sid.String() if err != nil { return user, errors.Wrap(err, "ConvertSidToStringSid failed") } user.Account, user.Domain, user.Type, err = tokenUser.User.Sid.LookupAccount("") if err != nil { return user, errors.Wrap(err, "LookupAccountSid failed") } return user, nil }
func GetProcCredName(pid int) (string, error) { var err error handle, err := syscall.OpenProcess(syscall.PROCESS_QUERY_INFORMATION, false, uint32(pid)) if err != nil { return "", fmt.Errorf("OpenProcess fails with %v", err) } defer syscall.CloseHandle(handle) var token syscall.Token // Find process token via win32 err = syscall.OpenProcessToken(handle, syscall.TOKEN_QUERY, &token) if err != nil { return "", fmt.Errorf("Error opening process token %v", err) } // Find the token user tokenUser, err := token.GetTokenUser() if err != nil { return "", fmt.Errorf("Error getting token user %v", err) } // Close token to prevent handle leaks err = token.Close() if err != nil { return "", fmt.Errorf("Error failed to closed process token") } // look up domain account by sid account, domain, _, err := tokenUser.User.Sid.LookupAccount("localhost") if err != nil { return "", fmt.Errorf("Error looking up sid %v", err) } return fmt.Sprintf("%s\\%s", domain, account), nil }
func getProcCredName(pid int) (string, error) { handle, err := syscall.OpenProcess(syscall.PROCESS_QUERY_INFORMATION, false, uint32(pid)) if err != nil { return "", errors.Wrapf(err, "OpenProcess failed for pid=%v", pid) } defer syscall.CloseHandle(handle) // Find process token via win32. var token syscall.Token err = syscall.OpenProcessToken(handle, syscall.TOKEN_QUERY, &token) if err != nil { return "", errors.Wrapf(err, "OpenProcessToken failed for pid=%v", pid) } // Find the token user. tokenUser, err := token.GetTokenUser() if err != nil { return "", errors.Wrapf(err, "GetTokenInformation failed for pid=%v", pid) } // Close token to prevent handle leaks. err = token.Close() if err != nil { return "", errors.Wrapf(err, "failed while closing process token handle for pid=%v", pid) } // Look up domain account by SID. account, domain, _, err := tokenUser.User.Sid.LookupAccount("") if err != nil { sid, sidErr := tokenUser.User.Sid.String() if sidErr != nil { return "", errors.Wrapf(err, "failed while looking up account name for pid=%v", pid) } return "", errors.Wrapf(err, "failed while looking up account name for SID=%v of pid=%v", sid, pid) } return fmt.Sprintf(`%s\%s`, domain, account), nil }