ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 99|ตอบกลับ: 0

[VB.NET] โค้ดโปรแกรมในการแก้ปัญหา Network Printer บน Windows 11 Home

[คัดลอกลิงก์]

330

กระทู้

525

โพสต์

7131

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
7131
โพสต์ 3 วันที่แล้ว | ดูโพสต์ทั้งหมด |โหมดอ่าน




Project Properties --> View Windows Settings ...


การนำไปใช้งานจริง ...

โค้ดโปรแกรม VB.NET ในการแก้ปัญหา Network Printer บน Windows 11 Home จะมีอยู่ 2 ขั้นตอนคือ ...
1. สร้าง User Login Credentials เข้าไปเก็บในเครื่อง Windows 11 Home
2. ทำการ  Registry ค่า RPC (Remote Procedure Call) ทั้งเครื่องแม่และเครื่องลูก ... กรณีที่เครื่องแม่เป็น Windows 10 ให้รีสตาร์ทใหม่ด้วย

ขั้นตอนการทำงาน: สั่งรันไฟล์ reg-server.reg ที่เครื่องแม่แล้วทำการรีสตาร์ท ส่วนตัวโปรแกรมให้ไปรันที่เครื่องลูก

Registry สำหรับเครื่องแม่ ...
  1. Windows Registry Editor Version 5.00

  2. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print]
  3. "RpcAuthnLevelPrivacyEnabled"=dword:00000000
คัดลอกไปที่คลิปบอร์ด

Registry สำหรับเครื่องลูก ...
  1. Windows Registry Editor Version 5.00

  2. [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Printers\RPC]
  3. "RpcUseNamedPipeProtocol"=dword:00000001
  4. "RpcAuthentication"=dword:00000000
  5. "RpcProtocols"=dword:00000007
  6. "ForceKerberosForRpc"=dword:00000000
  7. "RpcTcpPort"=dword:00000000

  8. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print]
  9. "RpcAuthnLevelPrivacyEnabled"=dword:00000000
คัดลอกไปที่คลิปบอร์ด

มาดูโค้ดในส่วนของฟอร์มหลัก ...
  1. Imports Microsoft.Win32

  2. Public Class frmMain

  3.     Private Sub btnSave_Click(sender As System.Object, e As System.EventArgs) Handles btnSave.Click
  4.         '// ตรวจสอบค่าว่างของ TextBox Control แต่ละตัว
  5.         Dim RequiredFields As Dictionary(Of TextBox, String) = New Dictionary(Of TextBox, String) From {
  6.             {txtTarget, "Enter your Domain or IP Address."},
  7.             {txtUserName, "Enter your Username."}
  8.         }
  9.         '// ใช้ For Each เพื่อลูปตรวจสอบทุก TextBox ใน Dictionary
  10.         For Each Field In RequiredFields
  11.             If String.IsNullOrWhiteSpace(Field.Key.Text) Then
  12.                 MessageBox.Show(Field.Value, "รายงานสถานะ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
  13.                 Field.Key.Focus()
  14.                 Return
  15.             End If
  16.         Next
  17.         '//
  18.         If CredentialManager.AddNetworkCredential(txtTarget.Text, txtUserName.Text, txtPassword.Text) Then
  19.             MessageBox.Show("เพิ่ม Network Credential สำเร็จ", "รายงานสถานะ", MessageBoxButtons.OK, MessageBoxIcon.Information)
  20.             '// เรียกไปโปรแกรมย่อยในการเขียนข้อมูลลง Registry
  21.             Call RegistryRPC()
  22.         End If
  23.     End Sub

  24.     ' / --------------------------------------------------------------------------------------
  25.     ' / Registry RPC (Remote Procedure Call)
  26.     ' / --------------------------------------------------------------------------------------
  27.     Private Sub RegistryRPC()
  28.         Try
  29.             Dim RegPath As String = "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Printers\RPC"
  30.             '// การกำหนดค่าให้กับ Key
  31.             '// ค่า 1 (เปิด) ใช้ Named Pipes เป็นโปรโตคอล RPC
  32.             Registry.SetValue(RegPath, "RpcUseNamedPipeProtocol", 1, RegistryValueKind.DWord)
  33.             '// ระบุวิธีการรับรองตัวตนของ RPC, 0 = ไม่มีการตรวจสอบสิทธิ์ (ไม่ปลอดภัย)
  34.             Registry.SetValue(RegPath, "RpcAuthentication", 0, RegistryValueKind.DWord)
  35.             '// ระบุว่าจะเปิดใช้งานโปรโตคอล RPC อะไรบ้าง (1 = TCP/IP, 2 = Named Pipes, 4 = LRPC (Local RPC), 7 = ทั้งหมด (1+2+4))
  36.             Registry.SetValue(RegPath, "RpcProtocols", 7, RegistryValueKind.DWord)
  37.             '// ค่า 1 จะบังคับใช้เฉพาะ Kerberos เท่านั้น, ค่า 0 = ไม่บังคับ
  38.             Registry.SetValue(RegPath, "ForceKerberosForRpc", 0, RegistryValueKind.DWord)
  39.             '// ใช้กำหนด TCP Port แบบคงที่ สำหรับ RPC, ค่า 0 หมายถึง ปล่อยให้ระบบกำหนดพอร์ตอัตโนมัติ
  40.             Registry.SetValue(RegPath, "RpcTcpPort", 0, RegistryValueKind.DWord)

  41.             '// Registry สำหรับ RpcAuthnLevelPrivacyEnabled
  42.             '// 0 ปิดการเข้ารหัส (Privacy Disabled), 1 เปิดใช้งานการเข้ารหัส (Privacy Enabled)
  43.             RegPath = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print"
  44.             Registry.SetValue(RegPath, "RpcAuthnLevelPrivacyEnabled", 0, RegistryValueKind.DWord)

  45.             MessageBox.Show("นโยบาย RPC ถูกกำหนดเรียบร้อย", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information)
  46.         Catch ex As Exception
  47.             MessageBox.Show("เกิดข้อผิดพลาด: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
  48.         End Try
  49.     End Sub

  50.     Private Sub txtTarget_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtTarget.KeyPress
  51.         If Asc(e.KeyChar) = Keys.Enter Then
  52.             e.Handled = True
  53.             SendKeys.Send("{TAB}")
  54.         End If
  55.     End Sub

  56.     Private Sub txtUserName_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtUserName.KeyPress
  57.         If Asc(e.KeyChar) = Keys.Enter Then
  58.             e.Handled = True
  59.             SendKeys.Send("{TAB}")
  60.         End If
  61.     End Sub

  62.     Private Sub txtPassword_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtPassword.KeyPress
  63.         If Asc(e.KeyChar) = Keys.Enter Then
  64.             e.Handled = True
  65.             SendKeys.Send("{TAB}")
  66.         End If
  67.     End Sub

  68.     Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  69.         txtTarget.Text = ""
  70.         txtUserName.Text = ""
  71.         txtPassword.Text = ""
  72.     End Sub

  73.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  74.         Me.Close()
  75.     End Sub

  76.     Private Sub frmMain_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  77.         Me.Dispose()
  78.         GC.SuppressFinalize(Me)
  79.         Application.Exit()
  80.     End Sub
  81. End Class
คัดลอกไปที่คลิปบอร์ด

คลาสสำหรับการสร้าง User Login Credentials ...
  1. Imports System.Net.NetworkInformation
  2. Imports System.Runtime.InteropServices
  3. Imports System.Text
  4. Imports System.IO

  5. Public Class CredentialManager
  6.     <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
  7.     Public Structure CREDENTIAL
  8.         Public Flags As UInteger
  9.         Public Type As UInteger
  10.         Public TargetName As String
  11.         Public Comment As String
  12.         Public LastWritten As Long
  13.         Public CredentialBlobSize As UInteger
  14.         Public CredentialBlob As IntPtr
  15.         Public Persist As UInteger
  16.         Public AttributeCount As UInteger
  17.         Public Attributes As IntPtr
  18.         Public TargetAlias As String
  19.         Public UserName As String
  20.     End Structure

  21.     <DllImport("advapi32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
  22.     Public Shared Function CredWrite(ByRef credential As CREDENTIAL, ByVal flags As UInteger) As Boolean
  23.     End Function

  24.     ' / --------------------------------------------------------------------------------------
  25.     ' / ส่วนของการเพิ่ม Target, Username และ Password เข้าไปใน Credential Manager ของ Windows 11 Home
  26.     ' / --------------------------------------------------------------------------------------
  27.     Public Shared Function AddNetworkCredential(target As String, username As String, password As String) As Boolean
  28.         Cursor.Current = Cursors.WaitCursor
  29.         Try
  30.             '// ตรวจสอบการ ping ไปยังเป้าหมาย
  31.             If Not PingHost(target) Then
  32.                 MessageBox.Show("ไม่สามารถเชื่อมต่อกับ: " & target, "การตรวจสอบล้มเหลว", MessageBoxButtons.OK, MessageBoxIcon.Warning)
  33.                 Return False
  34.             End If
  35.         Finally
  36.             Cursor.Current = Cursors.Default
  37.         End Try
  38.         '// แปลงรหัสผ่านจาก String เป็นอาร์เรย์ของ Byte ด้วยการเข้ารหัสแบบ Unicode
  39.         Dim PasswordBytes As Byte() = Encoding.Unicode.GetBytes(password)
  40.         '// จองพื้นที่ในหน่วยความจำแบบ unmanaged เพื่อใช้เก็บ byte array ของ Password
  41.         Dim PasswordPtr As IntPtr = Marshal.AllocCoTaskMem(PasswordBytes.Length)
  42.         Marshal.Copy(PasswordBytes, 0, PasswordPtr, PasswordBytes.Length)

  43.         '// Type เช่น 2 = CRED_TYPE_DOMAIN_PASSWORD
  44.         '// Target เช่น 192.168.1.11 หรือ thongkorn-pc
  45.         '// UserName เช่น admin หรือ everyone
  46.         '// Persist เช่น 2 = CRED_PERSIST_LOCAL_MACHINE
  47.         Dim cred As New CREDENTIAL With {
  48.             .Type = 2,
  49.             .TargetName = target,
  50.             .UserName = username,
  51.             .CredentialBlobSize = CUInt(PasswordBytes.Length),
  52.             .CredentialBlob = PasswordPtr,
  53.             .Persist = 2
  54.         }

  55.         '// เรียกใช้ ฟังก์ชัน Win32 API CredWrite (มาจาก advapi32.dll) ซึ่งใช้เพื่อบันทึกข้อมูล Credential (ชื่อผู้ใช้และรหัสผ่าน) ลงใน Windows Credential Manager
  56.         Dim result = CredWrite(cred, 0)
  57.         '// คืนพื้นที่หน่วยความจำแบบ unmanaged ที่จองไว้ก่อนหน้านี้ด้วย Marshal.AllocCoTaskMem
  58.         Marshal.FreeCoTaskMem(PasswordPtr)

  59.         If Not result Then MessageBox.Show("การเพิ่ม Network Credential ล้มเหลว: " & Marshal.GetLastWin32Error(), "รายงานสถานะ", MessageBoxButtons.OK, MessageBoxIcon.Error)
  60.         Return result
  61.     End Function

  62.     '// ตรวจสอบว่าเป้าหมายสามารถ ping ได้หรือไม่
  63.     Public Shared Function PingHost(host As String) As Boolean
  64.         Try
  65.             Using ping As New Ping()
  66.                 Dim reply = ping.Send(host, 1000) '// Timeout = 1 วินาที
  67.                 Return reply.Status = IPStatus.Success
  68.             End Using
  69.         Catch
  70.             Return False
  71.         End Try
  72.     End Function
  73. End Class
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2025-6-20 18:57 , Processed in 0.224738 second(s), 5 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้