using System; using System.Text; using System.Runtime.InteropServices; using System.Security.Principal; using System.Security.Permissions; [assembly:SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode=true)] [SecurityPermission(SecurityAction.Demand,ControlPrincipal = true)] public class Class1 { [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)] internal static extern bool CreateProcessWithLogonW(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonFlags, string applicationName, StringBuilder commandLine, int creationFlags, IntPtr environment, string currentDirectory, ref STARTUPINFO sui, out PROCESS_INFORMATION processInfo); [DllImport("kernel32")] static extern bool CloseHandle(IntPtr handle); [StructLayout(LayoutKind.Sequential)] internal struct STARTUPINFO { internal int cb; [MarshalAs(UnmanagedType.LPTStr)] internal string lpReserved; [MarshalAs(UnmanagedType.LPTStr)] internal string lpDesktop; [MarshalAs(UnmanagedType.LPTStr)] internal string lpTitle; internal int dwX; internal int dwY; internal int dwXSize; internal int dwYSize; internal int dwXCountChars; internal int dwYCountChars; internal int dwFillAttribute; internal int dwFlags; internal short wShowWindow; internal short cbReserved2; internal IntPtr lpReserved2; internal IntPtr hStdInput; internal IntPtr hStdOutput; internal IntPtr hStdError; } [StructLayout(LayoutKind.Sequential)] internal struct PROCESS_INFORMATION { internal IntPtr hProcess; internal IntPtr hThread; internal int dwProcessId; internal int dwThreadId; } //dwLogonFlags Specifies the logon option const int LOGON_WITH_PROFILE = 1; const int LOGON_NETCREDENTIALS_ONLY = 2; //dwCreationFlags - Specifies how the process is created const int CREATE_SUSPENDED = 0x00000004; const int CREATE_NEW_CONSOLE = 0x00000010; const int CREATE_NEW_PROCESS_GROUP = 0x00000200; const int CREATE_SEPARATE_WOW_VDM = 0x00000800; const int CREATE_UNICODE_ENVIRONMENT = 0x00000400; const int CREATE_DEFAULT_ERROR_MODE = 0x04000000; //dwCreationFlags parameter controls the new process's priority class const int NORMAL_PRIORITY_CLASS = 0x00000020; const int IDLE_PRIORITY_CLASS = 0x00000040; const int HIGH_PRIORITY_CLASS = 0x00000080; const int REALTIME_PRIORITY_CLASS = 0x00000100; const int BELOW_NORMAL_PRIORITY_CLASS = 0x00004000; const int ABOVE_NORMAL_PRIORITY_CLASS = 0x00008000; //dwFlags // This is a bit field that determines whether certain STARTUPINFO // members are used when the process creates a window. // Any combination of the following values can be specified: const int STARTF_USESHOWWINDOW = 0x0000000; const int STARTF_USESIZE = 0x00000002; const int STARTF_USEPOSITION = 0x00000004; const int STARTF_USECOUNTCHARS = 0x00000008; const int STARTF_USEFILLATTRIBUTE = 0x00000010; const int STARTF_FORCEONFEEDBACK = 0x00000040; const int STARTF_FORCEOFFFEEDBACK = 0x00000080; const int STARTF_USESTDHANDLES = 0x00000100; const int STARTF_USEHOTKEY = 0x00000200; public static void Main(string[] args) { // Account to run as string _logonName = "someone"; // some user string _domain = "."; // local machine account string _password = "secret"; StringBuilder sb = new StringBuilder(); // command to execute sb.Append(@"devenv.exe"); PROCESS_INFORMATION processInfo; STARTUPINFO startInfo = new STARTUPINFO(); startInfo.cb = Marshal.SizeOf(startInfo); startInfo.lpTitle = "This is a Command console"; startInfo.dwFlags = STARTF_USECOUNTCHARS; startInfo.dwYCountChars = 50; // create process similar as "runas" using the logon users profile bool ret = CreateProcessWithLogonW(_logonName, _domain, _password, LOGON_WITH_PROFILE, null, sb, NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, IntPtr.Zero, "c:\\", ref startInfo, out processInfo); Console.WriteLine("CreateProcessWithLogonW called"); if(!ret) // If failure ... Console.WriteLine("Error: {0}", Marshal.GetLastWin32Error()); else Console.WriteLine("ProcessID: {0}", processInfo.dwProcessId); } }
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;
[assembly:SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode=true)]
[SecurityPermission(SecurityAction.Demand,ControlPrincipal = true)]
public class Class1
{
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
internal static extern bool CreateProcessWithLogonW(String lpszUsername, String lpszDomain, String lpszPassword,
int dwLogonFlags, string applicationName, StringBuilder commandLine,
int creationFlags, IntPtr environment,
string currentDirectory,
ref STARTUPINFO sui,
out PROCESS_INFORMATION processInfo);
[DllImport("kernel32")]
static extern bool CloseHandle(IntPtr handle);
[StructLayout(LayoutKind.Sequential)]
internal struct STARTUPINFO {
internal int cb;
[MarshalAs(UnmanagedType.LPTStr)]
internal string lpReserved;
[MarshalAs(UnmanagedType.LPTStr)]
internal string lpDesktop;
[MarshalAs(UnmanagedType.LPTStr)]
internal string lpTitle;
internal int dwX;
internal int dwY;
internal int dwXSize;
internal int dwYSize;
internal int dwXCountChars;
internal int dwYCountChars;
internal int dwFillAttribute;
internal int dwFlags;
internal short wShowWindow;
internal short cbReserved2;
internal IntPtr lpReserved2;
internal IntPtr hStdInput;
internal IntPtr hStdOutput;
internal IntPtr hStdError;
}
[StructLayout(LayoutKind.Sequential)]
internal struct PROCESS_INFORMATION {
internal IntPtr hProcess;
internal IntPtr hThread;
internal int dwProcessId;
internal int dwThreadId;
}
//dwLogonFlags Specifies the logon option
const int LOGON_WITH_PROFILE = 1;
const int LOGON_NETCREDENTIALS_ONLY = 2;
//dwCreationFlags - Specifies how the process is created
const int CREATE_SUSPENDED = 0x00000004;
const int CREATE_NEW_CONSOLE = 0x00000010;
const int CREATE_NEW_PROCESS_GROUP = 0x00000200;
const int CREATE_SEPARATE_WOW_VDM = 0x00000800;
const int CREATE_UNICODE_ENVIRONMENT = 0x00000400;
const int CREATE_DEFAULT_ERROR_MODE = 0x04000000;
//dwCreationFlags parameter controls the new process's priority class
const int NORMAL_PRIORITY_CLASS = 0x00000020;
const int IDLE_PRIORITY_CLASS = 0x00000040;
const int HIGH_PRIORITY_CLASS = 0x00000080;
const int REALTIME_PRIORITY_CLASS = 0x00000100;
const int BELOW_NORMAL_PRIORITY_CLASS = 0x00004000;
const int ABOVE_NORMAL_PRIORITY_CLASS = 0x00008000;
//dwFlags
// This is a bit field that determines whether certain STARTUPINFO
// members are used when the process creates a window.
// Any combination of the following values can be specified:
const int STARTF_USESHOWWINDOW = 0x0000000;
const int STARTF_USESIZE = 0x00000002;
const int STARTF_USEPOSITION = 0x00000004;
const int STARTF_USECOUNTCHARS = 0x00000008;
const int STARTF_USEFILLATTRIBUTE = 0x00000010;
const int STARTF_FORCEONFEEDBACK = 0x00000040;
const int STARTF_FORCEOFFFEEDBACK = 0x00000080;
const int STARTF_USESTDHANDLES = 0x00000100;
const int STARTF_USEHOTKEY = 0x00000200;
public static void Main(string[] args)
{
// Account to run as
string _logonName = "someone"; // some user
string _domain = "."; // local machine account
string _password = "secret";
StringBuilder sb = new StringBuilder();
// command to execute
sb.Append(@"devenv.exe");
PROCESS_INFORMATION processInfo;
STARTUPINFO startInfo = new STARTUPINFO();
startInfo.cb = Marshal.SizeOf(startInfo);
startInfo.lpTitle = "This is a Command console";
startInfo.dwFlags = STARTF_USECOUNTCHARS;
startInfo.dwYCountChars = 50;
// create process similar as "runas" using the logon users profile
bool ret = CreateProcessWithLogonW(_logonName, _domain, _password,
LOGON_WITH_PROFILE, null, sb,
NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT,
IntPtr.Zero, "c:\\",
ref startInfo, out processInfo);
Console.WriteLine("CreateProcessWithLogonW called");
if(!ret)
// If failure ...
Console.WriteLine("Error: {0}", Marshal.GetLastWin32Error());
else
Console.WriteLine("ProcessID: {0}", processInfo.dwProcessId);
} }
那几个网址我只能打开第三个,没办法,教育网速度超慢,十个有九个都打不开.......