5

C# で PowerShell スクリプトを実行しようとしていますが、成功しません。これが私の機能です:

private void ExecutePowerShellCommand(string scriptfile)
{
    RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();

    Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
    runspace.Open();

    RunspaceInvoke scriptInvoker = new RunspaceInvoke();
    scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");

    Pipeline pipeline = runspace.CreatePipeline();

    //Here's how you add a new script with arguments
    Command myCommand = new Command(scriptfile);
    //CommandParameter testParam = new CommandParameter("key", "value");
    //myCommand.Parameters.Add(testParam);

    pipeline.Commands.Add(myCommand);

    // Execute PowerShell script
    pipeline.Invoke();
}

これは私が得るエラーです:

レジストリ キー 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' へのアクセスが拒否されました。

この問題を解決するにはどうすればよいですか? なりすましのアイデアは見たことがありますが、なりすましに適した例は見つかりませんでした。このスクリプトを管理者として実行したいと考えています。

私は次の宣言を行いました。

[DllImport("advapi32.dll")]
private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr handle);

public delegate void IncognitoDelegate(params object[] args);

偽装用に次の関数を作成しました。

public static void Impersonate(IncognitoDelegate incognitoDelegate, params object[] args)
{
    System.IntPtr token = new IntPtr();
    WindowsIdentity wi;
    if (LogonUser("myusername", "", "mypassword", 8, 0, ref token))
    {
        wi = new WindowsIdentity(token);
        WindowsImpersonationContext wic = wi.Impersonate();

        incognitoDelegate(args);

        wic.Undo();
    }
    CloseHandle(token);
}

デリゲートとして使用される関数を作成しました:

private static void GIncognito(params object[] args)
{
    RunspaceInvoke scriptInvoker = new RunspaceInvoke();
    scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");
}

そして、私は自分の方法を変更しました:

private void ExecutePowerShellCommand(string scriptfile)
{
    RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();

    Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
    runspace.Open();

    Impersonate(new Util.IncognitoDelegate(GIncognito));
    //RunspaceInvoke scriptInvoker = new RunspaceInvoke();
    //scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");

    Pipeline pipeline = runspace.CreatePipeline();

    //Here's how you add a new script with arguments
    Command myCommand = new Command(scriptfile);
    //CommandParameter testParam = new CommandParameter("key", "value");
    //myCommand.Parameters.Add(testParam);

    pipeline.Commands.Add(myCommand);

    // Execute PowerShell script
    pipeline.Invoke();
}

結果は...

...レジストリキーにアクセスできないという非常に同じエラー。

4

3 に答える 3

2

権限の昇格やレジストリの変更権限を必要としない方法 b を次に示し ます。

これをProcess.Start起動して、関連するイニシャル-commandまたは-file引数を追加します。

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy バイパス

ここに別のテクニックがあります http://dmitrysotnikov.wordpress.com/2008/06/27/powershell-script-in-a-bat-file/

これは、最初にエンコードして実行し、int を-EncodedCommandpowershell.exe の引数に渡すことに依存しています。これは、実行ポリシーをバイパスしているように見えます。

于 2012-11-20T19:00:50.433 に答える
1

デフォルトのSet-ExecutionPolicyコマンドは、マシン全体の値を設定しようとします。C# アプリケーションの範囲内でのみ設定を変更する必要がある-Scope Processため、コマンドにオプションを追加する必要があります。

を使用するGet-Help Set-ExecutionPolicy -detailedと、次の情報が明らかになります。

注: 既定 (LocalMachine) スコープの実行ポリシーを変更するには、[管理者として実行] オプションを使用して Windows PowerShell を起動します。

...そして、-Scopeオプションについても説明します。

これには、 C# アプリケーションから実行されるスクリプトの実行ポリシーにのみ影響を与えるという利点があり、既定の PowerShell 動作の実行ポリシーを不必要に変更することはありません。(そのため、アプリケーションが実行するスクリプトの有効性を保証できる場合は特に安全です。)

于 2013-05-02T18:09:18.070 に答える
0

次のようなものを試すことができます

using ( new Impersonator( "Username", "DomainName", "Password" ) )
{
    using (RunspaceInvoke invoker = new RunspaceInvoke())
    {
        invoker.Invoke("Set-ExecutionPolicy Unrestricted");
    }
}

これは、例としてアイデアを得るために見ることができるリンクです。 Class For Impersonating a User

于 2012-11-20T18:42:18.423 に答える