Documentation
¶
Overview ¶
Package adpwsh drives Active Directory through the ActiveDirectory PowerShell module running on a Windows jump box.
It knows nothing about Terraform. Every correctness rule it enforces — read-back after write, delete verification, pinned domain controller, serialized writes, fail-closed error classification, and the invariant that no value ever becomes PowerShell script text — is a guarantee made at the module boundary, so no consumer can opt out of it.
The read surface includes bounded, class-scoped search: OU.Search, Group.Search and User.Search each take a Query (an LDAP filter built through the exported EscapeFilter/Equal/And helpers, a search base, a scope and a size limit) and return typed results. It is not an arbitrary directory API — there is no generic object search, and object mutation remains get-by-identity only.
As of this version the library also manages object access control: ACL.Get/Grant/Revoke over explicit ACEs (never the whole DACL), Schema.Resolve (friendly name to schema GUID, with a well-known fast path), and Delegation which expands a curated task into the ACEs that implement it.
Example ¶
Example shows the whole contract in one page: a client is a transport plus a pinned DC; every write returns the read path's result; a replication timeout returns the model and an error together.
package main
import (
"context"
"errors"
"fmt"
adpwsh "github.com/nemethhh/go-adpwsh"
"github.com/nemethhh/go-adpwsh/transport/fake"
)
func main() {
dir := fake.NewDirectory()
client, err := adpwsh.New(context.Background(), adpwsh.Config{Transport: dir.Transport()})
if err != nil {
panic(err)
}
defer client.Close()
ou, err := client.OU.Create(context.Background(), adpwsh.OUSpec{
Name: "Staff",
Container: client.DefaultNamingContext(),
})
if err != nil && !errors.Is(err, adpwsh.ErrReplication) {
panic(err)
}
fmt.Println(ou.DN, ou.Protected)
}
Output: OU=Staff,DC=corp,DC=local true
Index ¶
- Constants
- Variables
- func ACLEndpointHelpers() string
- func And(terms ...string) string
- func Bool(b bool) *bool
- func Equal(attr, value string) string
- func EscapeFilter(value string) string
- func Int(i int) *int
- func ParseEnvelope(op string, r Result) (json.RawMessage, error)
- func String(s string) *string
- type ACE
- type ACESpec
- type ACEType
- type ACLClient
- type Client
- type Computer
- type ComputerClient
- func (cc *ComputerClient) Create(ctx context.Context, spec ComputerSpec) (*Computer, error)
- func (cc *ComputerClient) Delete(ctx context.Context, id Identity) error
- func (cc *ComputerClient) Get(ctx context.Context, id Identity) (*Computer, error)
- func (cc *ComputerClient) Search(ctx context.Context, q Query) ([]Computer, error)
- func (cc *ComputerClient) Update(ctx context.Context, id Identity, spec ComputerSpec) (*Computer, error)
- type ComputerSpec
- type Config
- type Credential
- type DelegationClient
- type DelegationTask
- type DeleteOptions
- type Dialect
- type Error
- type GMSA
- type GMSASpec
- type Group
- type GroupCategory
- type GroupClient
- func (g *GroupClient) AddMembers(ctx context.Context, group Identity, members []Identity) error
- func (g *GroupClient) Create(ctx context.Context, spec GroupSpec) (*Group, error)
- func (g *GroupClient) Delete(ctx context.Context, id Identity) error
- func (g *GroupClient) Get(ctx context.Context, id Identity) (*Group, error)
- func (g *GroupClient) IsMember(ctx context.Context, group, member Identity) (bool, error)
- func (g *GroupClient) Members(ctx context.Context, group Identity) ([]Member, error)
- func (g *GroupClient) MembersRecursive(ctx context.Context, group Identity) ([]Member, error)
- func (g *GroupClient) RemoveMembers(ctx context.Context, group Identity, members []Identity) error
- func (g *GroupClient) Search(ctx context.Context, q Query) ([]Group, error)
- func (g *GroupClient) Update(ctx context.Context, id Identity, spec GroupSpec) (*Group, error)
- type GroupScope
- type GroupSpec
- type Identity
- type Inheritance
- type Kind
- type Logger
- type Member
- type OU
- type OUClient
- func (o *OUClient) Create(ctx context.Context, spec OUSpec) (*OU, error)
- func (o *OUClient) Delete(ctx context.Context, id Identity, opts DeleteOptions) error
- func (o *OUClient) Get(ctx context.Context, id Identity) (*OU, error)
- func (o *OUClient) Search(ctx context.Context, q Query) ([]OU, error)
- func (o *OUClient) Update(ctx context.Context, id Identity, spec OUSpec) (*OU, error)
- type OUSpec
- type OptTime
- type Query
- type ReplicationConfig
- type Result
- type RetryConfig
- type Right
- type SchemaClient
- type SchemaRef
- type SchemaRefKind
- type SearchScope
- type Secret
- type ServiceAccountClient
- func (s *ServiceAccountClient) Create(ctx context.Context, spec GMSASpec) (*GMSA, error)
- func (s *ServiceAccountClient) Delete(ctx context.Context, id Identity) error
- func (s *ServiceAccountClient) Get(ctx context.Context, id Identity) (*GMSA, error)
- func (s *ServiceAccountClient) Search(ctx context.Context, q Query) ([]GMSA, error)
- func (s *ServiceAccountClient) Update(ctx context.Context, id Identity, spec GMSASpec) (*GMSA, error)
- type Transport
- type User
- type UserClient
- func (u *UserClient) Create(ctx context.Context, spec UserSpec) (*User, error)
- func (u *UserClient) Delete(ctx context.Context, id Identity) error
- func (u *UserClient) Get(ctx context.Context, id Identity) (*User, error)
- func (u *UserClient) Search(ctx context.Context, q Query) ([]User, error)
- func (u *UserClient) SetPassword(ctx context.Context, id Identity, pw Secret) error
- func (u *UserClient) Update(ctx context.Context, id Identity, spec UserSpec) (*User, error)
- type UserSpec
Examples ¶
Constants ¶
const ( KindUnknown = adcore.KindUnknown KindNotFound = adcore.KindNotFound KindAlreadyExists = adcore.KindAlreadyExists KindDenied = adcore.KindDenied KindConstraint = adcore.KindConstraint KindPassword = adcore.KindPassword KindReferral = adcore.KindReferral KindTransient = adcore.KindTransient KindTransport = adcore.KindTransport KindInvalidAttribute = adcore.KindInvalidAttribute KindSchema = adcore.KindSchema KindReplication = adcore.KindReplication KindTooManyResults = adcore.KindTooManyResults KindUnsupported = adcore.KindUnsupported SearchScopeBase = adcore.SearchScopeBase SearchScopeOneLevel = adcore.SearchScopeOneLevel SearchScopeSubtree = adcore.SearchScopeSubtree GroupScopeGlobal = adcore.GroupScopeGlobal GroupScopeDomainLocal = adcore.GroupScopeDomainLocal GroupScopeUniversal = adcore.GroupScopeUniversal GroupCategorySecurity = adcore.GroupCategorySecurity GroupCategoryDistribution = adcore.GroupCategoryDistribution InheritanceThis = adcore.InheritanceThis InheritanceDescendants = adcore.InheritanceDescendants InheritanceChildren = adcore.InheritanceChildren ACEAllow = adcore.ACEAllow ACEDeny = adcore.ACEDeny RefAttribute = adcore.RefAttribute RefClass = adcore.RefClass RefExtendedRight = adcore.RefExtendedRight TaskResetUserPasswords = adcore.TaskResetUserPasswords TaskManageUsers = adcore.TaskManageUsers TaskModifyGroupMembership = adcore.TaskModifyGroupMembership TaskManageGroups = adcore.TaskManageGroups )
Variables ¶
var ( ErrNotFound = adcore.ErrNotFound ErrAlreadyExists = adcore.ErrAlreadyExists ErrDenied = adcore.ErrDenied ErrConstraint = adcore.ErrConstraint ErrPassword = adcore.ErrPassword ErrReferral = adcore.ErrReferral ErrTransient = adcore.ErrTransient ErrTransport = adcore.ErrTransport ErrInvalidAttribute = adcore.ErrInvalidAttribute ErrSchema = adcore.ErrSchema ErrReplication = adcore.ErrReplication ErrTooManyResults = adcore.ErrTooManyResults ErrUnsupported = adcore.ErrUnsupported )
Functions ¶
func ACLEndpointHelpers ¶ added in v0.18.0
func ACLEndpointHelpers() string
ACLEndpointHelpers returns the PowerShell -FunctionDefinitions block that a ConstrainedLanguage management-host endpoint must install so the provider can run ACL delegation in constrained mode. The Terraform provider embeds a copy in its endpoint-registration script and drift-tests it against this value.
func EscapeFilter ¶ added in v0.4.0
EscapeFilter escapes one LDAP assertion value per RFC 4515.
func ParseEnvelope ¶ added in v0.2.2
func ParseEnvelope(op string, r Result) (json.RawMessage, error)
ParseEnvelope turns one raw Result into either the operation's data or a classified *Error. A non-zero exit or a missing envelope is KindTransport: the script exits 0 even when AD refuses, so anything else means the transport or the pwsh process itself failed.
It is exported for the build-time tooling in this module that needs a query the op set does not expose — cmd/adschema — so that such a tool inherits this library's error classification instead of inventing its own. It confers no ability to run script text: the caller must already hold a Result.
Types ¶
type ACLClient ¶ added in v0.5.0
type ACLClient struct {
// contains filtered or unexported fields
}
ACLClient reads and writes the discretionary ACL of a directory object. It is never authoritative over the whole DACL: Grant adds explicit ACEs and Revoke subtracts the rights it names from the matching explicit ACE, leaving inherited entries and other trustees untouched.
func (*ACLClient) Get ¶ added in v0.5.0
Get returns every ACE on target's DACL, including inherited ones (the Inherited flag distinguishes them). The caller matches the explicit ACE it owns and ignores the rest.
func (*ACLClient) Grant ¶ added in v0.5.0
Grant adds each ACE to target's DACL. Adding an ACE that is already present is a no-op on the DC, so Grant is idempotent.
func (*ACLClient) Revoke ¶ added in v0.5.0
Revoke subtracts the rights named by each ACE from target's DACL. It uses .NET RemoveAccessRule, so it removes the named rights from the matching explicit ACE (same trustee, type and scope) even when Active Directory has coalesced several grants into one larger ACE — the case RemoveAccessRuleSpecific could not reach, because AddAccessRule unions masks on grant. For an ACE that stands alone, subtracting its whole mask empties and drops it, so the common case is unchanged. Revoking rights that are already absent is a no-op, so Revoke stays idempotent.
type Client ¶
type Client struct {
OU *OUClient
Group *GroupClient
User *UserClient
ServiceAccount *ServiceAccountClient
Computer *ComputerClient
Schema *SchemaClient
ACL *ACLClient
Delegation *DelegationClient
// contains filtered or unexported fields
}
Client is the entry point. Its sub-clients map one method to one provider resource operation.
func New ¶
New validates the configuration, resolves the domain controller this client will pin for its lifetime, and proves the jump box can import the ActiveDirectory module. It performs one round trip.
func (*Client) DefaultNamingContext ¶
DefaultNamingContext returns the domain's naming context, e.g. "DC=corp,DC=local".
type ComputerClient ¶ added in v0.11.0
type ComputerClient struct {
// contains filtered or unexported fields
}
ComputerClient is the computer account (objectClass "computer") sub-client.
func (*ComputerClient) Create ¶ added in v0.11.0
func (cc *ComputerClient) Create(ctx context.Context, spec ComputerSpec) (*Computer, error)
Create makes a computer account and returns the result of the same read Get performs. It may return a non-nil Computer together with a non-nil error on a replication timeout; the caller must persist the model and surface the error. OperatingSystem/OperatingSystemVersion/OperatingSystemServicePack are never written here: they are read-only (the joined machine owns them) and are not on ComputerSpec.
func (*ComputerClient) Delete ¶ added in v0.11.0
func (cc *ComputerClient) Delete(ctx context.Context, id Identity) error
Delete removes a computer account and returns nil only after a re-read confirms it is gone.
func (*ComputerClient) Search ¶ added in v0.11.0
Search returns every computer account under q.SearchBase matching q.Filter.
func (*ComputerClient) Update ¶ added in v0.11.0
func (cc *ComputerClient) Update(ctx context.Context, id Identity, spec ComputerSpec) (*Computer, error)
Update folds the attribute write, the rename and the move into one round trip.
type ComputerSpec ¶ added in v0.11.0
type ComputerSpec = adcore.ComputerSpec
type Config ¶
type Config struct {
// Transport is how PowerShell reaches the jump box. Required.
Transport Transport
// Dialect selects the script set. The zero value, DialectADWS, preserves
// the historical behaviour exactly.
Dialect Dialect
// Server pins the domain controller every cmdlet targets. When empty it is
// discovered once in New and never changes for this client's lifetime.
Server string
// Credential, when set, becomes the -Credential passed to every cmdlet on
// the jump box. Omit it to use the transport session's own identity.
Credential *Credential
// Retry governs re-attempts, and applies only to errors classified
// transient.
Retry adcore.RetryConfig
// Replication governs the post-write wait.
Replication ReplicationConfig
// Log is an optional output port. It is not an extension seam: redaction
// cannot be the caller's job, because the caller never sees the payload.
// The library masks credential-bearing keys before anything reaches Log.
Log Logger
}
Config configures a Client. Transport is the only required field.
type Credential ¶
Credential is a username and password for the AD cmdlets.
type DelegationClient ¶ added in v0.5.0
type DelegationClient = adcore.Delegation
DelegationClient keeps its name here although the type is called Delegation in adcore: it is reached as Client.Delegation, and the provider names the type directly.
type DelegationTask ¶ added in v0.5.0
type DelegationTask = adcore.DelegationTask
func Tasks ¶ added in v0.5.0
func Tasks() []DelegationTask
Tasks returns every delegation task name, in a stable order.
type DeleteOptions ¶
type DeleteOptions = adcore.DeleteOptions
type Dialect ¶ added in v0.21.0
type Dialect int
Dialect selects which PowerShell script set an operation runs.
The zero value is DialectADWS: Microsoft's ActiveDirectory module over AD Web Services, which requires a Windows host. DialectPSOpenAD runs the PSOpenAD module over LDAP and works anywhere PowerShell 7.4 does, including Linux.
There is deliberately no auto-detection. A dialect decides which module executes, and guessing it is the same class of mistake as guessing a transport.
type GroupCategory ¶
type GroupCategory = adcore.GroupCategory
type GroupClient ¶
type GroupClient struct {
// contains filtered or unexported fields
}
GroupClient is the group sub-client.
func (*GroupClient) AddMembers ¶ added in v0.3.0
AddMembers adds each member to the group. It is idempotent: a member already present is not an error. A member that does not exist is a real error and is surfaced.
func (*GroupClient) Create ¶
Create makes a group and returns the result of the same read Get performs. It may return a non-nil Group together with a non-nil error on a replication timeout; the caller must persist the model and surface the error.
func (*GroupClient) Delete ¶
func (g *GroupClient) Delete(ctx context.Context, id Identity) error
Delete removes a group and returns nil only after a re-read confirms it is gone.
func (*GroupClient) IsMember ¶ added in v0.3.0
IsMember reports whether member is a direct member of group without enumerating the group. A not-found group or member reads as "false": the edge cannot exist, which is drift the caller reconciles rather than an error.
func (*GroupClient) Members ¶ added in v0.3.0
Members reads a group's full membership. It pages the multivalued member attribute so the result is correct for a group of any size.
func (*GroupClient) MembersRecursive ¶ added in v0.7.0
MembersRecursive reads a group's effective membership: the leaf accounts (users and computers) reachable through nested groups, matching Get-ADGroupMember -Recursive. Group objects are traversed but never returned — not even an empty nested group (confirmed against a real domain). Primary-group-only membership (e.g. a user's primary Domain Users) is not included — it is stored via primaryGroupID, not the member attribute.
func (*GroupClient) RemoveMembers ¶ added in v0.3.0
RemoveMembers removes each member from the group. It is idempotent: a member not present is not an error, and a not-found group is success — the edges are gone regardless.
type GroupScope ¶
type GroupScope = adcore.GroupScope
type Identity ¶
func ByGUID ¶
ByGUID identifies an object by objectGUID. This is the canonical form: it survives rename and move, which DN and sAMAccountName do not.
type Inheritance ¶ added in v0.5.0
type Inheritance = adcore.Inheritance
type Kind ¶
func Classify ¶
Classify normalizes an AD exception into a Kind. It fails closed: an unrecognized (type, code) pair is KindUnknown and is never retried.
The Win32 code table is shared with the LDAP backend and lives in adcore; only the exception-name table below is PowerShell's, so only it stayed here. The code still wins wherever it is present, because the ActiveDirectory module builds the exception from it.
type Logger ¶
Logger is the output port. A three-line adapter satisfies it from tflog, which is how the provider gets logging without this module importing anything from Terraform.
type OUClient ¶
type OUClient struct {
// contains filtered or unexported fields
}
OUClient is the organizational-unit sub-client.
func (*OUClient) Create ¶
Create makes an organizational unit and returns the result of the same read Get performs, so an inconsistent result after apply is impossible by construction.
It may return a non-nil OU together with a non-nil error: that is the replication-timeout contract. The object exists and the wait did not complete, so the caller must persist the model and surface the error. Ignoring the model orphans the object.
func (*OUClient) Delete ¶
Delete removes an organizational unit and returns nil only after a re-read confirms it is gone. A non-empty OU is never deleted recursively: the error names the child count. Remove-ADOrganizationalUnit -Recursive exists and is deliberately not reachable from this API.
func (*OUClient) Search ¶ added in v0.4.0
Search returns every organizational unit under q.SearchBase matching q.Filter. It errors with KindTooManyResults rather than truncating: the script requests one row over the limit, and finding it means more exist.
func (*OUClient) Update ¶
Update folds the attribute write, the rename and the move into one round trip, in the order that keeps the DN valid. It never deletes and recreates, because that destroys the object's SID and with it every ACL referencing it.
Like Create, it may return a non-nil OU with a non-nil error on a replication timeout.
type OptTime ¶
type ReplicationConfig ¶
type ReplicationConfig struct {
Wait bool
Targets []string // DC host names, or the single element "all"
ForceSync bool
Timeout time.Duration
PollInterval time.Duration
}
ReplicationConfig governs the wait that follows a write. Replication is a property of domain topology, not of any single object, so it is configured once on the client.
type RetryConfig ¶
type RetryConfig = adcore.RetryConfig
type SchemaClient ¶ added in v0.5.0
type SchemaClient struct {
// contains filtered or unexported fields
}
SchemaClient resolves friendly schema names to GUIDs.
type SchemaRefKind ¶ added in v0.5.0
type SchemaRefKind = adcore.SchemaRefKind
type SearchScope ¶ added in v0.4.0
type SearchScope = adcore.SearchScope
type ServiceAccountClient ¶ added in v0.10.0
type ServiceAccountClient struct {
// contains filtered or unexported fields
}
ServiceAccountClient is the group Managed Service Account (gMSA) sub-client.
func (*ServiceAccountClient) Create ¶ added in v0.10.0
Create makes a group Managed Service Account and returns the result of the same read Get performs. It may return a non-nil GMSA together with a non-nil error on a replication timeout; the caller must persist the model and surface the error.
func (*ServiceAccountClient) Delete ¶ added in v0.10.0
func (s *ServiceAccountClient) Delete(ctx context.Context, id Identity) error
Delete removes a group Managed Service Account and returns nil only after a re-read confirms it is gone.
func (*ServiceAccountClient) Search ¶ added in v0.10.0
Search returns every group Managed Service Account under q.SearchBase matching q.Filter.
func (*ServiceAccountClient) Update ¶ added in v0.10.0
func (s *ServiceAccountClient) Update(ctx context.Context, id Identity, spec GMSASpec) (*GMSA, error)
Update folds the attribute write, the rename and the move into one round trip. ManagedPasswordIntervalInDays is never referenced here: it is create-only, since Set-ADServiceAccount has no such parameter.
type Transport ¶
type Transport interface {
Run(ctx context.Context, encodedCommand string, payload []byte) (Result, error)
Close() error
}
Transport runs one PowerShell command on the jump box.
Implementations must invoke:
<pwsh> -NoProfile -NonInteractive -EncodedCommand <encodedCommand>
with payload written to the process's standard input and closed, and must return its stdout, stderr and exit code verbatim.
Run returns a non-nil error only when the process could not be run to completion — dial, authentication, channel exhaustion, context cancellation. A non-zero exit is reported through Result.ExitCode, never as an error: the distinction between "AD said no" and "we could not reach AD" is decided above this interface, not inside it. An implementation that can classify its own failure should return an *Error with the appropriate Kind (KindTransient for an exhausted channel, KindTransport for a dial or auth failure); any other error is treated as KindTransport.
type UserClient ¶
type UserClient struct {
// contains filtered or unexported fields
}
UserClient is the user sub-client.
func (*UserClient) Create ¶
Create makes a user account and returns the result of the same read Get performs. It may return a non-nil User together with a non-nil error on a replication timeout; the caller must persist the model and surface the error.
AD refuses to enable an account with no password satisfying domain policy, so Enabled: true without a Password fails with AD's own error rather than being papered over by silently creating a disabled account.
func (*UserClient) Delete ¶
func (u *UserClient) Delete(ctx context.Context, id Identity) error
Delete removes a user and returns nil only after a re-read confirms it is gone.
func (*UserClient) Search ¶ added in v0.4.0
Search returns every user under q.SearchBase matching q.Filter.
func (*UserClient) SetPassword ¶
SetPassword resets the account's password through Set-ADAccountPassword -Reset. The error it returns never echoes the value.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
cmd
|
|
|
adschema
command
Command adschema exports an Active Directory schema catalog: every attribute's type and constraints, and every requested class's effective set of allowed attributes.
|
Command adschema exports an Active Directory schema catalog: every attribute's type and constraints, and every requested class's effective set of allowed attributes. |
|
internal
|
|
|
adschema
Package adschema is the schema exporter's guts: one fetch over a transport, the inheritance closure that turns what was fetched into effective attribute sets, and the deterministic serialiser that writes the catalog.
|
Package adschema is the schema exporter's guts: one fetch over a transport, the inheritance closure that turns what was fetched into effective attribute sets, and the deterministic serialiser that writes the catalog. |
|
adscript
Package adscript holds the constant PowerShell this library runs, the encoder that hands it to pwsh, and the builder for the attribute half of a Set-AD* payload.
|
Package adscript holds the constant PowerShell this library runs, the encoder that hands it to pwsh, and the builder for the attribute half of a Set-AD* payload. |
|
oop
Package oop drives PowerShell's OutOfProcess PSRP framing over an arbitrary byte stream (an SSH subsystem channel to `pwsh -sshs`, or a local child process's stdio to `pwsh -SSHServerMode`), exposing an io.ReadWriter + MultiplexedTransport for github.com/smnsjas/go-psrpcore/runspace.
|
Package oop drives PowerShell's OutOfProcess PSRP framing over an arbitrary byte stream (an SSH subsystem channel to `pwsh -sshs`, or a local child process's stdio to `pwsh -SSHServerMode`), exposing an io.ReadWriter + MultiplexedTransport for github.com/smnsjas/go-psrpcore/runspace. |
|
psrun
Package psrun is the shared runspace-executor core for the warm transports that drive a pwsh -sshs/-SSHServerMode server over the out-of-proc adapter.
|
Package psrun is the shared runspace-executor core for the warm transports that drive a pwsh -sshs/-SSHServerMode server over the out-of-proc adapter. |
|
warm
Package warm is the transport-agnostic warm-runspace engine: a pool of persistent PSRP executors with an idle reaper and a one-shot, pre-execution-only retry.
|
Package warm is the transport-agnostic warm-runspace engine: a pool of persistent PSRP executors with an idle reaper and a one-shot, pre-execution-only retry. |
|
transport
|
|
|
fake
Package fake provides a Transport double: it synthesizes result envelopes, injects AD exceptions, and records what was asked of it.
|
Package fake provides a Transport double: it synthesizes result envelopes, injects AD exceptions, and records what was asked of it. |
|
local
Package local is the transport that runs PowerShell on the machine the caller itself runs on.
|
Package local is the transport that runs PowerShell on the machine the caller itself runs on. |
|
localwarm
Package localwarm runs go-adpwsh operations in a persistent local PowerShell 7 runspace (pwsh -SSHServerMode) driven over the out-of-proc adapter, pooled by internal/warm.
|
Package localwarm runs go-adpwsh operations in a persistent local PowerShell 7 runspace (pwsh -SSHServerMode) driven over the out-of-proc adapter, pooled by internal/warm. |
|
ssh
Package ssh is the transport that carries go-adpwsh to a Windows jump box.
|
Package ssh is the transport that carries go-adpwsh to a Windows jump box. |
|
sshwarm
Package sshwarm runs go-adpwsh operations in a persistent pwsh -sshs runspace on a Windows jump box, reached over an SSH subsystem channel and driven by the out-of-proc adapter, pooled by internal/warm.
|
Package sshwarm runs go-adpwsh operations in a persistent pwsh -sshs runspace on a Windows jump box, reached over an SSH subsystem channel and driven by the out-of-proc adapter, pooled by internal/warm. |
|
winrm
Package winrm runs go-adpwsh's PowerShell commands over PSRP/WinRM using github.com/smnsjas/go-psrp.
|
Package winrm runs go-adpwsh's PowerShell commands over PSRP/WinRM using github.com/smnsjas/go-psrp. |