Запуск программы от имени юзера
Комманда runas мне не подходит, потому что она не дает возможности ввести пароль автоматически. Мне нужно, чтобы юзеры, рыботающие с прогой, не могли переписать базу данных (путь к ней они знают), только программы должна знать пароль пользователя, от имени которого она запускается.
Возможно ли это?
Если нет, то как по-другому можно обеспечить безопастность базы данных, чтобы ее не можно было переписать?
Насколько сложно сломать пароль аксесса?
Цитата:
Originally posted by angor
У меня есть программа, работающая с базой занных, заданной через сетевой путь \\server\folder\bd.mdb (к сожалению аксесс). Я создал юзера и на уровне NTFS и сетевого доступа выставил для него полные права. Как сделать так, что программа, которая работает с базой, запускалась от имени этого юзера?
Комманда runas мне не подходит, потому что она не дает возможности ввести пароль автоматически. Мне нужно, чтобы юзеры, рыботающие с прогой, не могли переписать базу данных (путь к ней они знают), только программы должна знать пароль пользователя, от имени которого она запускается.
Возможно ли это?
Если нет, то как по-другому можно обеспечить безопастность базы данных, чтобы ее не можно было переписать?
Насколько сложно сломать пароль аксесса?
У меня есть программа, работающая с базой занных, заданной через сетевой путь \\server\folder\bd.mdb (к сожалению аксесс). Я создал юзера и на уровне NTFS и сетевого доступа выставил для него полные права. Как сделать так, что программа, которая работает с базой, запускалась от имени этого юзера?
Комманда runas мне не подходит, потому что она не дает возможности ввести пароль автоматически. Мне нужно, чтобы юзеры, рыботающие с прогой, не могли переписать базу данных (путь к ней они знают), только программы должна знать пароль пользователя, от имени которого она запускается.
Возможно ли это?
Если нет, то как по-другому можно обеспечить безопастность базы данных, чтобы ее не можно было переписать?
Насколько сложно сломать пароль аксесса?
Придётся импортировать CreateProcessAsUser,
И к ней впридачу LogonUser + описать кучку структур...
Можешь попробовать через ODBC
Код:
namespace RunAs
{
class Class1
{
public const UInt32 Infinite = 0xffffffff;
public const Int32 Startf_UseStdHandles = 0x00000100;
public const Int32 StdOutputHandle = -11;
public const Int32 StdErrorHandle = -12;
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
public struct StartupInfo
{
public int cb;
public String reserved;
public String desktop;
public String title;
public int x;
public int y;
public int xSize;
public int ySize;
public int xCountChars;
public int yCountChars;
public int fillAttribute;
public int flags;
public UInt16 showWindow;
public UInt16 reserved2;
public byte reserved3;
public IntPtr stdInput;
public IntPtr stdOutput;
public IntPtr stdError;
}
internal struct ProcessInformation
{
public IntPtr process;
public IntPtr thread;
public int processId;
public int threadId;
}
[DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
public static extern bool CreateProcessWithLogonW(
String userName,
String domain,
String password,
UInt32 logonFlags,
String applicationName,
String commandLine,
UInt32 creationFlags,
UInt32 environment,
String currentDirectory,
ref StartupInfo startupInfo,
out ProcessInformation processInformation);
[DllImport("kernel32.dll", SetLastError=true)]
public static extern bool GetExitCodeProcess(IntPtr process, ref UInt32 exitCode);
[DllImport("Kernel32.dll", SetLastError=true)]
public static extern UInt32 WaitForSingleObject(IntPtr handle, UInt32 milliseconds);
[DllImport("Kernel32.dll", SetLastError=true)]
public static extern IntPtr GetStdHandle(IntPtr handle);
[DllImport("Kernel32.dll", SetLastError=true)]
public static extern bool CloseHandle(IntPtr handle);
[STAThread]
static void Main(string[] args)
{
StartupInfo startupInfo = new StartupInfo();
startupInfo.reserved = null;
startupInfo.flags &= Startf_UseStdHandles;
startupInfo.stdOutput = (IntPtr)StdOutputHandle;
startupInfo.stdError = (IntPtr)StdErrorHandle;
UInt32 exitCode = 123456;
ProcessInformation processInfo = new ProcessInformation();
String command = @"c:\windows\notepad.exe";
String user = "administrator";
String domain = System.Environment.MachineName;
String password = "Blank";
String currentDirectory = System.IO.Directory.GetCurrentDirectory();
try
{
CreateProcessWithLogonW(
user,
domain,
password,
(UInt32) 1,
command,
command,
(UInt32) 0,
(UInt32) 0,
currentDirectory,
ref startupInfo,
out processInfo);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("Running ...");
WaitForSingleObject(processInfo.process, Infinite);
GetExitCodeProcess(processInfo.process, ref exitCode);
Console.WriteLine("Exit code: {0}", exitCode);
CloseHandle(processInfo.process);
CloseHandle(processInfo.thread);
}
}
}
{
class Class1
{
public const UInt32 Infinite = 0xffffffff;
public const Int32 Startf_UseStdHandles = 0x00000100;
public const Int32 StdOutputHandle = -11;
public const Int32 StdErrorHandle = -12;
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
public struct StartupInfo
{
public int cb;
public String reserved;
public String desktop;
public String title;
public int x;
public int y;
public int xSize;
public int ySize;
public int xCountChars;
public int yCountChars;
public int fillAttribute;
public int flags;
public UInt16 showWindow;
public UInt16 reserved2;
public byte reserved3;
public IntPtr stdInput;
public IntPtr stdOutput;
public IntPtr stdError;
}
internal struct ProcessInformation
{
public IntPtr process;
public IntPtr thread;
public int processId;
public int threadId;
}
[DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
public static extern bool CreateProcessWithLogonW(
String userName,
String domain,
String password,
UInt32 logonFlags,
String applicationName,
String commandLine,
UInt32 creationFlags,
UInt32 environment,
String currentDirectory,
ref StartupInfo startupInfo,
out ProcessInformation processInformation);
[DllImport("kernel32.dll", SetLastError=true)]
public static extern bool GetExitCodeProcess(IntPtr process, ref UInt32 exitCode);
[DllImport("Kernel32.dll", SetLastError=true)]
public static extern UInt32 WaitForSingleObject(IntPtr handle, UInt32 milliseconds);
[DllImport("Kernel32.dll", SetLastError=true)]
public static extern IntPtr GetStdHandle(IntPtr handle);
[DllImport("Kernel32.dll", SetLastError=true)]
public static extern bool CloseHandle(IntPtr handle);
[STAThread]
static void Main(string[] args)
{
StartupInfo startupInfo = new StartupInfo();
startupInfo.reserved = null;
startupInfo.flags &= Startf_UseStdHandles;
startupInfo.stdOutput = (IntPtr)StdOutputHandle;
startupInfo.stdError = (IntPtr)StdErrorHandle;
UInt32 exitCode = 123456;
ProcessInformation processInfo = new ProcessInformation();
String command = @"c:\windows\notepad.exe";
String user = "administrator";
String domain = System.Environment.MachineName;
String password = "Blank";
String currentDirectory = System.IO.Directory.GetCurrentDirectory();
try
{
CreateProcessWithLogonW(
user,
domain,
password,
(UInt32) 1,
command,
command,
(UInt32) 0,
(UInt32) 0,
currentDirectory,
ref startupInfo,
out processInfo);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("Running ...");
WaitForSingleObject(processInfo.process, Infinite);
GetExitCodeProcess(processInfo.process, ref exitCode);
Console.WriteLine("Exit code: {0}", exitCode);
CloseHandle(processInfo.process);
CloseHandle(processInfo.thread);
}
}
}