Hello all!
Помогите новичку!
Пытаюсь залогиниться на шару
private void OpenShare(string ShareName)
{
ProcessStartInfo info1 = new ProcessStartInfo("net.exe", @"use \\" +
this.strMachine +
@"\" +
ShareName +
" " +
this.strPassword +
@" /USER:" +
this.strUserName);
info1.CreateNoWindow = true;
info1.WindowStyle = ProcessWindowStyle.Hidden;
info1.RedirectStandardInput = true;
info1.RedirectStandardOutput = true;
info1.UseShellExecute = false;
Process.Start(info1).WaitForExit();
}
Способ, конечно, явно тревожный

, но другого так в голову так и не пришло.
Однако, и это работать почему-то не хочет.
Не будет ли так любезен всемогущий ALL ткнуть носом в ламерские ошибки или,
чего бы очень хотелось, подсказать более правильный способ решения?
Заранее благодарен за любые ответы и критику

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Вопрос снят!
Покурил MSDN
здесь... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Покурил
"The .NET Developer's Guide to Windows Security"
By Keith Brown
Как результат, ниже приведенное, вроде работает.
Однако, ощущение тревожности кода почему-то не покидает
Пожалуйста, покритикуйте мой ламерский код. Буду очень признателен !
Работает только >= WinXP
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace NetworkComputers
{
#region Enums
public enum CREDUI_FLAGS
{
INCORRECT_PASSWORD = 0x1,
DO_NOT_PERSIST = 0x2,
REQUEST_ADMINISTRATOR = 0x4,
EXCLUDE_CERTIFICATES = 0x8,
REQUIRE_CERTIFICATE = 0x10,
SHOW_SAVE_CHECK_BOX = 0x40,
ALWAYS_SHOW_UI = 0x80,
REQUIRE_SMARTCARD = 0x100,
PASSWORD_ONLY_OK = 0x200,
VALIDATE_USERNAME = 0x400,
COMPLETE_USERNAME = 0x800,
PERSIST = 0x1000,
SERVER_CREDENTIAL = 0x4000,
EXPECT_CONFIRMATION = 0x20000,
GENERIC_CREDENTIALS = 0x40000,
USERNAME_TARGET_CREDENTIALS = 0x80000,
KEEP_USERNAME = 0x100000,
}
public enum CredUIReturnCodes
{
NO_ERROR = 0,
ERROR_CANCELLED = 1223,
ERROR_NO_SUCH_LOGON_SESSION = 1312,
ERROR_NOT_FOUND = 1168,
ERROR_INVALID_ACCOUNT_NAME = 1315,
ERROR_INSUFFICIENT_BUFFER = 122,
ERROR_INVALID_PARAMETER = 87,
ERROR_INVALID_FLAGS = 1004,
}
public struct CREDUI_INFO
{
public int cbSize;
public IntPtr hwndParent;
[MarshalAs(UnmanagedType.LPWStr)]
public string pszMessageText;
[MarshalAs(UnmanagedType.LPWStr)]
public string pszCaptionText;
public IntPtr hbmBanner;
}
#endregion
public class PasswordPrompt
{
const int MAX_USER_NAME = 256;
const int MAX_PASSWORD = 256;
const int MAX_DOMAIN = 256;
CREDUI_INFO creduInfo;
#region Dll Immort
[DllImport("credui.dll", EntryPoint = "CredUIPromptForCredentialsW", CharSet = CharSet.Unicode)]
private static extern CredUIReturnCodes CredUIPromptForCredentials(ref CREDUI_INFO creditUR,
string targetName,
IntPtr reserved1,
int iError,
StringBuilder userName,
int maxUserName,
StringBuilder password,
int maxPassword,
ref int iSave,
CREDUI_FLAGS flags);
[DllImport("credui.dll", EntryPoint = "CredUIConfirmCredentialsW", CharSet = CharSet.Unicode)]
private static extern CredUIReturnCodes CredUIConfirmCredentials(string targetName,
bool confirm);
[DllImport("credui.dll", EntryPoint = "CredUIParseUserNameW", CharSet = CharSet.Unicode)]
private static extern CredUIReturnCodes CredUIParseUserName(
string userName,
StringBuilder user,
int userMaxChars,
StringBuilder domain,
int domainMaxChars);
#endregion
public PasswordPrompt(IntPtr hwndParent, string pszMessageText, string pszCaptionText)
{
creduInfo = new CREDUI_INFO();
creduInfo.cbSize = Marshal.SizeOf(creduInfo);
creduInfo.hwndParent = hwndParent;
creduInfo.pszMessageText = pszMessageText;
creduInfo.pszCaptionText = pszCaptionText;
creduInfo.hbmBanner = IntPtr.Zero;
}
public bool ConfirmCredentials( string targetName, bool confirm)
{
CredUIReturnCodes result = CredUIConfirmCredentials(targetName, confirm);
switch(result)
{
case CredUIReturnCodes.ERROR_INVALID_PARAMETER:
case CredUIReturnCodes.ERROR_NOT_FOUND:
return false;
case CredUIReturnCodes.NO_ERROR:
return true;
default:
return false;
}
}
public bool ParseUserName(string uName, ref string userName, ref string domain)
{
StringBuilder user = new StringBuilder(MAX_USER_NAME);
StringBuilder host = new StringBuilder(MAX_DOMAIN);
CredUIReturnCodes result = CredUIParseUserName(uName, user, MAX_USER_NAME, host, MAX_DOMAIN);
switch(result)
{
case CredUIReturnCodes.ERROR_INVALID_ACCOUNT_NAME:
case CredUIReturnCodes.ERROR_INSUFFICIENT_BUFFER:
case CredUIReturnCodes.ERROR_INVALID_PARAMETER:
return false;
case CredUIReturnCodes.NO_ERROR:
userName = user.ToString();
domain = host.ToString();
return true;
default:
return false;
}
}
public bool PromptForCredentials(
string targetName,
ref string userName,
ref string password,
ref bool save,
CREDUI_FLAGS flags,
out string errorMessage)
{
int saveCredentials;
StringBuilder user = new StringBuilder(MAX_USER_NAME);
StringBuilder pwd = new StringBuilder(MAX_PASSWORD);
saveCredentials = Convert.ToInt32(save);
CredUIReturnCodes result = CredUIPromptForCredentials(
ref creduInfo,
targetName,
IntPtr.Zero,
0,
user,
MAX_USER_NAME,
pwd,
MAX_PASSWORD,
ref saveCredentials,
flags);
switch (result)
{
case CredUIReturnCodes.ERROR_CANCELLED:
errorMessage = "CANCELLED";
return false;
case CredUIReturnCodes.ERROR_INVALID_FLAGS:
case CredUIReturnCodes.ERROR_INSUFFICIENT_BUFFER:
case CredUIReturnCodes.ERROR_INVALID_PARAMETER:
errorMessage = "ERROR: INVALID PARAMETER";
return false;
case CredUIReturnCodes.ERROR_INVALID_ACCOUNT_NAME:
errorMessage = "ERROR: INVALID ACCOUNT NAME !";
return false;
case CredUIReturnCodes.ERROR_NO_SUCH_LOGON_SESSION:
errorMessage = "ERROR: NO SUCH LOGON SESSION !";
return false;
case CredUIReturnCodes.ERROR_NOT_FOUND:
errorMessage = "ERROR: HOST NOT FOUND !";
return false;
case CredUIReturnCodes.NO_ERROR:
{
save = Convert.ToBoolean(saveCredentials);
userName = user.ToString();
password = pwd.ToString();
errorMessage = "SUCCESS";
return true;
}
default:
errorMessage = "ERROR";
return false;
}
}
}
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>