2017-06-27 8 views
2

リモートサーバーで動作するスクリプトを実行するユーザーボックスでスクリプトを実行します。ただし、ユーザーはサーバーへのアクセス権を持たないため、アクセス許可を持つ別のユーザーとしてスクリプトを実行します。'query user'を使用してアクティブユーザーのユーザー名を取得する方法

私が問題を抱えているのは、ログオンしたユーザー(ボックスユーザー)のユーザー名とドメインをサーバーに渡す必要があることです。必要なデータを取得するためのさまざまなコマンドがありますが、PowerShell ISEを別のユーザーとして実行すると、それらのユーザーはすべて、ログオンしていないユーザーのデータを返します。

の私が話しているコマンドの一部:

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name 
$env:USERNAME 
$env:USERDOMAIN 
$(whoami) 

私はそれがしたいように動作するように思える唯一のものである:

query user 

このリターン形式:

 
USERNAME    SESSIONNAME  ID STATE IDLE TIME LOGON TIME 
>user1    sessionName   4 Active   . 6/22/2017 2:56 PM 

私の二つの質問は以下のとおりです。

  1. あまりにもこのようにドメインを取得する方法はありますか?このコマンドを実行すると、私はそれを見ない。
  2. クエリユーザーからユーザー名を取得する方法はありますか?どのような特異性が「アクティブな」ユーザー名ですか?
+0

'$ env:USERNAME'と' $ env:USERDOMAIN'を使用する際の問題は何ですか? – gms0ulman

+1

私の推測では、彼は別のセッションでユーザーのユーザー/ドメインを特定しようとしています。 – thepip3r

+0

@ thepip3r Hmmm ...質問から私は2人のユーザーがいることを理解しています。しかし、私には、ローカル(ボックス)ユーザーの情報を照会するリモート(サーバー)セッションを取得するのは少し後退しているようです。組み込みの環境変数を使用して、リモートで実行しているコードにスクリプトや関数のパラメータとして渡すのがより理にかなっています(免責事項:私はリモーティングで多くのことをしていないので、何かが欠けている可能性があります) – gms0ulman

答えて

2

クエリのアクティブユーザー:

query user | Select-String '^>(\w+)' | ForEach-Object { $_.Matches[0].Groups[1].Value } 

これは空白を含まないユーザ名に依存します。 queryコマンドに/serverパラメータを追加して、リモートコンピュータを照会します。

+0

@Bill_Stewartありがとう、これは私がユーザー名を抽出するために探していたものです。 – Zirono

+1

@Zirono - よく聞こえます - あなたの質問を答えたと考えるならば、答えを記入してください。 –

1

win32_loggedonuserには、各ユーザーの 'antecedent'プロパティに必要なすべての情報があります。文字列解析を使用してフィルタリングする必要がありますが、探しているものがあります。追加のセッション関連情報が必要な場合は、 'dependent'プロパティの値を使用して、Win32_logonsessionでlogontypeやstarttimeなどを検索できます。

$s = (gwmi win32_loggedonuser).antecedent.split('=') 
$s[1].Replace('"', '').Replace(',Name', '') ## domain 
$s[2].Replace('"','') ## username 

edit:上記の出力は、単一のユーザーシナリオで出力を解析して表示します。マルチユーザーのシナリオでは、結果をループして各ユーザーに対して同様の操作を実行する必要があります。私の意図は、例を提供することでした。

edit2:Get-WmiObjectの-computernameプロパティを使用すると、適切なアクセス許可を使用してリモートコンピュータに対してこれを実行できます。

+0

ありがとう@ thepip3r、私はあなたがBill_Stewartの答えと組み合わせて私が必要とするものを得るために提案したようなループでこれを使うことができると思います。 – Zirono

1

あなたは、WMI経由でデスクトップユーザーに、ログインしてあなたがquery user出力から抽出されたユーザ名(Bill_Stewart's answerを参照)によって、そのリストをフィルタリング列挙できます、query userコマンドリスト

$user = (& query user) -replace '^>(\S+).*', '$1' 

$qry = 'SELECT * FROM Win32_Process WHERE Name="explorer.exe"' 
Get-WmiObject -Query $qry | ForEach-Object { 
    $_.GetOwner() 
} | Sort-Object -Unique User, Domain | Where-Object { 
    $_.User -eq $user 
} | ForEach-Object { 
    '{0}\{1}' -f $_.Domain, $_.User 
} 

リモートデスクトップセッション/ユーザーを複数のユーザーが同時にログインできる場合は、コマンドの出力をフィルタリングする必要があります。

+0

私はあまりにも思っていたことを正確にthatsそして、私はページをリロードし、あなたの答えを見た。ありがとう! – Zirono

関連する問題