LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#编程实现Windows系统自动登录

admin
2021年2月15日 12:34 本文热度 4333

通过注册表修改实现。Windows内置了自动登录的机制,在登录系统时,winlogon会检查注册表下有没有设置自动登录,如果设置了就上就会读取用户名和密码,然后进行验证,通过后就登录进系统了。

方法

注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

键值:

键值设置值作用
AutoAdminLogon11表示自动登录,0表示禁止自动登录
DefaultDomainName设置值域名,如果没有就留空
DefaultUserNameabc登录系统用的用户名
DefaultPassword123登录系统用的用户名使用的密码,如果想加密保存就删除此键值
DontDisplayLastUserName1 

注意,下面两个键值必须删除掉,否则会显示一个通知对话框。

  • LegalNoticeCaption
  • LegalNoticeText


另外还有2个键值,作用分别如下:

  • IgnoreShiftOverride 忽略shift键,默认在开机时按shift机会显示登录对话框(即使设置成自动登录),设置成1后,按shift键也没用了。
  • AutoLogonCount 设置自动登录次数
  • ForceAutoLogon 该值要删除掉

 

特别注意

由于密码是明文保存的,很不安全,所以windows中提供了一个秘密的地方来保存加密后的密码,就是在lsa中。sysinternals中autologon工具就是把密码保存进去的。 在Winlogon中,它会先到lsa中用找“DefaultPassword”的信息,找到后就用这个密码,如果找不到就到注册表下去找“DefaultPassword”值。

读写lsa的代码,这个代码是pinvoke.net 中找到的。原文:
http://www.pinvoke.net/default.aspx/advapi32/DefaultPassword.html

其中C++代码由微软提供:http://msdn.microsoft.com/en-us/library/aa378826(VS.85).aspx 
C#代码为:http://www.pinvoke.net/default.aspx/advapi32/LsaRetrievePrivateData.html 
获取LUAUtil类后,如下调用即可,

LSAutil lsa = new LSAutil("DefaultPassword");
lsa.SetSecret(“abc”);
Console.Write(lsa.GetSecret());

http://www.cnblogs.com/greenerycn/archive/2009/11/18/windows_auto_logon.html

该文章在 2021/2/15 12:34:36 编辑过

全部评论1

admin
2021年2月15日 12:38
LsaRetrievePrivateData(advapi32)

C#签名:

[DllImport(“ advapi32.dll”,SetLastError = true,PreserveSig = true)]
    私有静态外部int LsaRetrievePrivateData(
                IntPtr PolicyHandle,
                ref LSA_UNICODE_STRING KeyName,
                out IntPtr PrivateData
    );

VB签名:

私有声明函数LsaRetrievePrivateData Lib“ ADVAPI32.dll”(ByVal PolicyHandle尽可能长,ByRef KeyName就像LSA_UNICODE_STRING,ByVal私有数据一样长)

用户定义的类型:

私有类型LSA_UNICODE_STRING
   长度为整数'WORD
   MaximumLength为整数'WORD
   缓冲区为long'PWCHAR-指针
结束类型

备用托管API:

你认识一个吗 请贡献它!

笔记:

有关自定义封送程序的信息,请参见LsaOpenPolicy

提示与技巧:

不要使用LSA私有数据功能。而是使用CryptProtectDataCryptUnprotectData函数。

(但是,当您需要修改COM Runas Passwords时,这些将不起作用。)

样例代码:

使用系统;

使用System.Text;

使用System.Runtime.InteropServices;

命名空间pinvoke.lsautil.lsautil

{

    公共类LSAutil
    {

    [StructLayout(LayoutKind.Sequential)]
    私有结构LSA_UNICODE_STRING
    {
        public UInt16 Length;
        公共UInt16 MaximumLength;
        公共IntPtr缓冲区;
    }

    [StructLayout(LayoutKind.Sequential)]
    私有结构LSA_OBJECT_ATTRIBUTES
    {
        public int Length;
        公共IntPtr RootDirectory;
        公共LSA_UNICODE_STRING ObjectName;
        公共uint属性;
        公共IntPtr SecurityDescriptor;
        公共IntPtr SecurityQualityOfService;
    }

    私人枚举LSA_AccessPolicy:长
    {
        POLICY_VIEW_LOCAL_INFORMATION = 0x00000001L,
        POLICY_VIEW_AUDIT_INFORMATION = 0x00000002L,
        POLICY_GET_PRIVATE_INFORMATION = 0x00000004L,
        POLICY_TRUST_ADMIN = 0x00000008L,
        POLICY_CREATE_ACCOUNT = 0x00000010L,
        POLICY_CREATE_SECRET = 0x00000020L,
        POLICY_CREATE_PRIVILEGE = 0x00000040L,
        POLICY_SET_DEFAULT_QUOTA_LIMITS = 0x00000080L,
        POLICY_SET_AUDIT_REQUIREMENTS = 0x00000100L,
        POLICY_AUDIT_LOG_ADMIN = 0x00000200L,
        POLICY_SERVER_ADMIN = 0x00000400L,
        POLICY_LOOKUP_NAMES = 0x00000800L,
        POLICY_NOTIFICATION = 0x00001000L
    }

    [DllImport(“ advapi32.dll”,SetLastError = true,PreserveSig = true)]
    私有静态外部uint LsaRetrievePrivateData(
                IntPtr PolicyHandle,
                ref LSA_UNICODE_STRING KeyName,
                out IntPtr PrivateData
    );

    [DllImport(“ advapi32.dll”,SetLastError = true,PreserveSig = true)]
    私有静态外部uint LsaStorePrivateData(
         IntPtr policyHandle,
         ref LSA_UNICODE_STRING KeyName,
         ref LSA_UNICODE_STRING PrivateData
    );

    [DllImport(“ advapi32.dll”,SetLastError = true,PreserveSig = true)]
    私有静态外部uint LsaOpenPolicy(
       ref LSA_UNICODE_STRING系统名称,
       ref LSA_OBJECT_ATTRIBUTES ObjectAttributes,
       uint DesiredAccess,
       在IntPtr PolicyHandle中
    );

    [DllImport(“ advapi32.dll”,SetLastError = true,PreserveSig = true)]
    私有静态外部uint LsaNtStatusToWinError(
        uint status
    );

    [DllImport(“ advapi32.dll”,SetLastError = true,PreserveSig = true)]
    私有静态外部uint LsaClose(
        IntPtr policyHandle
    );

    [DllImport(“ advapi32.dll”,SetLastError = true,PreserveSig = true)]
    专用静态外部uint LsaFreeMemory(
        IntPtr buffer
    );

    私有LSA_OBJECT_ATTRIBUTES objectAttributes;
    私有LSA_UNICODE_STRING本地系统;
    私有LSA_UNICODE_STRING secretName;

    公共LSAutil(字符串密钥)
    {
        如果(key.Length == 0)
        {
        抛出新的Exception(“密钥长度为零”);
        }

        objectAttributes = new LSA_OBJECT_ATTRIBUTES();
        objectAttributes.Length = 0;
        objectAttributes.RootDirectory = IntPtr.Zero;
        objectAttributes.Attributes = 0;
        objectAttributes.SecurityDescriptor = IntPtr.Zero;
        objectAttributes.SecurityQualityOfService = IntPtr.Zero;

        localsystem =新的LSA_UNICODE_STRING();
        localsystem.Buffer = IntPtr.Zero;
        localsystem.Length = 0;
        localsystem.MaximumLength = 0;

        secretName =新的LSA_UNICODE_STRING();
        secretName.Buffer = Marshal.StringToHGlobalUni(key);
        secretName.Length =(UInt16)(key.Length * UnicodeEncoding.CharSize);
        secretName.MaximumLength =(UInt16)(((key.Length + 1)* UnicodeEncoding.CharSize);

    }

    私有IntPtr GetLsaPolicy(LSA_AccessPolicy访问)
    {
        IntPtr LsaPolicyHandle;

        uint ntsResult = LsaOpenPolicy(ref this.localsystem,ref this.objectAttributes,(uint)access,out LsaPolicyHandle);

        uint winErrorCode = LsaNtStatusToWinError(ntsResult);
        如果(winErrorCode!= 0)
        {
        抛出新的Exception(“ LsaOpenPolicy失败:” + winErrorCode);
        }

        return LsaPolicyHandle;
    }

    私有静态void ReleaseLsaPolicy(IntPtr LsaPolicyHandle)
    {
        uint ntsResult = LsaClose(LsaPolicyHandle);
        uint winErrorCode = LsaNtStatusToWinError(ntsResult);
        如果(winErrorCode!= 0)
        {
        抛出新的Exception(“ LsaClose失败:” + winErrorCode);
        }
    }

    私有静态无效FreeMemory(IntPtr Buffer)
    {
        uint ntsResult = LsaFreeMemory(Buffer);
        uint winErrorCode = LsaNtStatusToWinError(ntsResult);
        if(winErrorCode!= 0)
        {
        抛出新的Exception(“ LsaFreeMemory failed:” + winErrorCode);
        }
    }

    public void SetSecret(string value)
    {
        LSA_UNICODE_STRING lusSecretData = new LSA_UNICODE_STRING();

        if(value.Length> 0)
        {
        //创建数据和键
        lusSecretData.Buffer = Marshal.StringToHGlobalUni(value);
        lusSecretData.Length =(UInt16)(value.Length * UnicodeEncoding.CharSize);
        lusSecretData.MaximumLength =(UInt16)(((value.Length + 1)* UnicodeEncoding.CharSize);
        }
        else
        {
        //删除数据和键
        lusSecretData.Buffer = IntPtr.Zero;
        lusSecretData.Length = 0;
        lusSecretData.MaximumLength = 0;
        }

        IntPtr LsaPolicyHandle = GetLsaPolicy(LSA_AccessPolicy.POLICY_CREATE_SECRET);
        uint结果= LsaStorePrivateData(LsaPolicyHandle,ref secretName,ref lusSecretData);
        ReleaseLsaPolicy(LsaPolicyHandle);

        uint winErrorCode = LsaNtStatusToWinError(result);
        如果(winErrorCode!= 0)
        {
        抛出新的Exception(“ StorePrivateData失败:” + winErrorCode);
        }
    }

    public string GetSecret()
    {
        IntPtr PrivateData = IntPtr.Zero;

        IntPtr LsaPolicyHandle = GetLsaPolicy(LSA_AccessPolicy.POLICY_GET_PRIVATE_INFORMATION);
        uint ntsResult = LsaRetrievePrivateData(LsaPolicyHandle,ref secretName,out PrivateData);
        ReleaseLsaPolicy(LsaPolicyHandle);

        uint winErrorCode = LsaNtStatusToWinError(ntsResult);
        如果(winErrorCode!= 0)
        {
        抛出新的Exception(“ RetreivePrivateData失败:” + winErrorCode);
        }

        LSA_UNICODE_STRING lusSecretData =
        (LSA_UNICODE_STRING)Marshal.PtrToStructure(PrivateData,typeof(LSA_UNICODE_STRING));
        字符串值= Marshal.PtrToStringAuto(lusSecretData.Buffer).Substring(0,lusSecretData.Length / 2);

        FreeMemory(PrivateData);

        返回值
    }

    }

}


该评论在 2021/2/15 12:38:45 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved