Как залогиниться на общем ресурсе
От: George Saveliev Украина  
Дата: 27.05.06 13:33
Оценка:
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>>
Re: Как залогиниться на общем ресурсе
От: George Saveliev Украина  
Дата: 27.05.06 18:57
Оценка: 5 (2)
Вопрос снят!
Покурил MSDN здесь
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Как залогиниться на общем ресурсе
От: George Saveliev Украина  
Дата: 09.06.06 20:25
Оценка:
Покурил
"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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.