2

私は現在、新しいプロセスで自分のプログラムを呼び出しています。

MyProcessStartInfo.Verb = "runas";
MyProcessStartInfo.Arguments = "MyFlag";

そして、プロセスが開始すると、フラグをチェックします。そこにある場合–メソッドを実行してClose();

しかし、それが簡単にできるのであれば、私はむしろもっとミニマルなことをしたいと思います。それは可能ですか?

編集:VistaとWindows7を使用します。

4

3 に答える 3

2

実行中のプロセスを昇格させることはできません。それは単に不可能です。高い特権を持つ別のプロセスを生み出すことによって、あなたはそれを正しい方法で行っています。他に方法はありません。

ありがとう。でも、メソッドを新しいプロセスとして始める方法があるのではないかと思っていました。

メソッドを含む別のアプリケーション実行可能ファイルを作成できます。そうすれば、アプリケーションを再起動する必要はありません。他のプロセスを開始するだけで済みます。

于 2012-05-14T16:34:54.237 に答える
1

ミニマルではありませんが、ネット上のソースから作成したこのプロパティを使用できます。これらの呼び出しの一部はpInvokeのものです。だからグーグル'pinvokeメソッド'それらを見つけるために。

public static bool IsRunAsAdministrator
{
    get
    {
        WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
        if (windowsIdentity.IsSystem) return true;

        WindowsPrincipal windowsPrincipal = new WindowsPrincipal(windowsIdentity);
        if (windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator))
            return true;

        //Vista or higher check
        if (Environment.OSVersion.Version.Major >= 6)
        {
            IntPtr hToken = IntPtr.Zero;
            try
            {
                if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, out hToken))
                    Win32.ThrowLastError();

                TOKEN_ELEVATION_TYPE elevationType;
                IntPtr pElevationType = Marshal.AllocHGlobal(sizeof(TOKEN_ELEVATION_TYPE));
                uint dwSize;

                if (!GetTokenInformation(
                    hToken,
                    TOKEN_INFORMATION_CLASS.TokenElevationType,
                    pElevationType,
                    sizeof(TOKEN_ELEVATION_TYPE),
                    out dwSize
                    ))
                    Win32.ThrowLastError();

                elevationType = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(pElevationType);
                Marshal.FreeHGlobal(pElevationType);

                return elevationType == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull;
            }
            finally
            {
                CloseHandle(hToken);
            }
        }
        else
            return true;
    }
}
于 2012-05-14T16:34:06.833 に答える
0

Windows APILogonUserを使用してから、別のユーザーになりすまして、そのユーザーとしてコードを実行することができます。ただし、制限があります。UACを有効LogonUserにすると、制限付きのユーザートークンが提供されます。つまり、偽装されたユーザー(管理者であっても)が既に持っている以上の権限を取得することはありません。この制限は、非対話型セッション(Windowsサービス)には適用されません。

これは、コードで偽装する方法に関するドキュメントです。また、このSOの質問/回答がおもしろいと思うかもしれません。

于 2012-05-14T17:34:43.190 に答える