1

私は次のことをしようとしています: 1. VS.NET 2005 を実行している XP SP2 マシンに管理者アカウントとしてログインしています 2. このマシンには、ゲスト アカウントである別のアカウント user1 もあります 3. 次のようにプログラムを実行しています管理者、このプログラムから、user1 セキュリティ コンテキスト 4 で実行される notepad.exe プロセスを起動したいと考えてCreateProcessasUserいます。

これは、私が試したことを説明するコードスニッパーです..

const string GRANTED_ALL = "10000000";

const int LOGON32_LOGON_INTERACTIVE = 2;
const int LOGON32_LOGON_NETWORK = 3;
const int LOGON32_LOGON_BATCH = 4;
const int LOGON32_LOGON_SERVICE = 5;
const int LOGON32_LOGON_UNLOCK = 7;
const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8;
const int LOGON32_LOGON_NEW_CREDENTIALS = 9;

const int LOGON32_PROVIDER_DEFAULT = 0;
static IntPtr hToken = IntPtr.Zero;
static IntPtr hTokenDuplicate = IntPtr.Zero;

static void Main(string[] args)
{
    int last_error = 0;
    if(LogonUser("user1",null,"#welcome123",
        LOGON32_LOGON_INTERACTIVE, 
        LOGON32_PROVIDER_DEFAULT, out hToken))
    {
        last_error = Marshal.GetLastWin32Error();
        PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
        STARTUPINFO si = new STARTUPINFO();
        SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
        last_error = 0;
        last_error = Marshal.GetLastWin32Error();
        if(DuplicateTokenEx(hToken,UInt32.Parse(GRANTED_ALL,System.Globalization.NumberStyles.HexNumber),
            ref sa,SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation,
            TOKEN_TYPE.TokenPrimary,out hTokenDuplicate))
        {
            last_error = 0;
            last_error = Marshal.GetLastWin32Error();

            CreateProcessAsUser(hTokenDuplicate, "d:\\san\\notepad.exe", null,
            ref sa, ref sa, false, 0, IntPtr.Zero, "d:\\san", ref si, out pi);

            last_error = 0;
            last_error = Marshal.GetLastWin32Error();

        }
    }

    last_error = 0;
    last_error = Marshal.GetLastWin32Error();


    if (hToken != IntPtr.Zero) CloseHandle(hToken);
    if (hTokenDuplicate != IntPtr.Zero) CloseHandle(hTokenDuplicate);

}

何らかの理由でこれは機能していません..DuplicateTokenEx関数は1305のエラーコードとして返されており、その理由がわかりません..

DuplicateTokenExも使用した代わりにDuplicateTokenCreateProcessAsUserがエラー コード 1308 を返すようになりました。

誰かがこの問題に光を当ててくれませんか..これは明らかに非常に単純なことのように見えますが、正しく理解できません.. [私は特にやりたいことに注意しLogonUserDuplicateTokenくださいCreateProcessAsUSer]

4

1 に答える 1

-2

CreateProcessAsUser() ウィンドウステーションおよびデスクトップを参照してください。

しかし、私は管理された方法でそれを行うことをお勧めします:

...
using System.Diagnostics;
using System.Security;
...
...
string progPath = @"c:\WINNT\notepad.exe";
ProcessStartInfo startInfo = new ProcessStartInfo(progPath);
startInfo.WindowStyle = ProcessWindowStyle.Normal;
startInfo.UseShellExecute = false;
startInfo.UserName = "SomeUser";
SecureString password = new SecureString();

#region setting password
password.AppendChar('p');
password.AppendChar('a');
...
#endregion

startInfo.Password = password;
Process.Start(startInfo);
...
...
于 2008-11-27T07:53:33.933 に答える