C#编程实现Windows系统自动登录
|
admin
2021年2月15日 12:34
本文热度 4333
|
通过注册表修改实现。Windows内置了自动登录的机制,在登录系统时,winlogon会检查注册表下有没有设置自动登录,如果设置了就上就会读取用户名和密码,然后进行验证,通过后就登录进系统了。
方法:
注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
键值:
键值 | 设置值 | 作用 |
AutoAdminLogon | 1 | 1表示自动登录,0表示禁止自动登录 |
DefaultDomainName | 设置值 | 域名,如果没有就留空 |
DefaultUserName | abc | 登录系统用的用户名 |
DefaultPassword | 123 | 登录系统用的用户名使用的密码,如果想加密保存就删除此键值 |
DontDisplayLastUserName | 1 | |
注意,下面两个键值必须删除掉,否则会显示一个通知对话框。
- 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私有数据功能。而是使用CryptProtectData和CryptUnprotectData函数。 (但是,当您需要修改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 编辑过
|