2017-01-27 5 views
2

ローカルシステム(nt authority\system)として実行されるpowershellスクリプトを指定します。
現在ログインしているユーザーとしてコマンドを実行する方法はありますか(もちろんユーザーパスワードは指定しないでください)。
これまでに試したことから、-Userパラメーターを取るRegister-ScheduledTaskコマンドレットがあります。タスクはスケジュールされ、正常に実行されました。それを考えると、もっと直接的なやり方があるはずです。現在ログインしているユーザーとしてpowershellコマンドを実行します。

答えて

2

私はschtasks.exeを使用します。これが純粋なPSでできるかどうかはわかりません。

$user = Get-WmiObject -Class win32_computersystem | % Username 

$computer = $env:COMPUTERNAME 

$time = (Get-Date).AddMinutes(1).ToShortTimeString() 

schtasks /create /s $computer /tn "RunCMD" /sc once /tr "cmd.exe" /st $time /ru $user 
+0

私は 'Register-ScheduledTask'はちょうど同じもので、$ env:USERNAMEと同じだと思います。スクリプトはシステムとして実行されているので、現在ログインしているユーザの名前はあなたに与えられません。 – Bax

+0

タスク全体がSYSTEMとして実行されている場合でも、常にWMIを使用してユーザー名を取得します。私の更新された答えを見てください。 –

2

正確にこれを行うための複雑な方法があります。 API関数CreateProcessAsUserが必要です。これを呼び出すには、WTSQueryUserToken API関数を使用して現在のコンソールセッションに関連付けられたTOKENを取得する必要があります。これには、WTSGetActiveConsoleSessionId API関数で取得されたセッションIDが使用されます。 (多くの例では、トークンが重複していることが示されていますが、私が読んだことからは、WTSQueryUserTokenはすでにプライマリトークンを返しているので不要です)。

また、作成します。そのためには、CreateEnvironmentBlock API関数を使用します。 CREATE_UNICODE_ENVIRONMENTフラグを指定してください。

もちろん、PowerShellではこれらの関数を直接呼び出すことはできません。そのため、C#ヘルパーコードを動的にコンパイルしてPowerShell環境に読み込む必要があります。

+1

トークンの操作はまったく単純なトピックではなく、とにかくさらに多くのドキュメントを使用する可能性があるので、この例を見てみたいと思います。 – DeepS1X

関連する問題